代码随想录算法训练营第34天|46. 携带研究材料、416. 分割等和子集
文章目录
- 46. 携带研究材料
- 416. 分割等和子集
46. 携带研究材料
卡码网 46. 携带研究材料
代码随想录
dp[i][j]表示,考虑到第i个物品的情况下,背包容量为j的最大价值。
m, n = map(int, input().split(" "))
costs = list(map(int, input().split(" ")))
values = list(map(int, input().split(" ")))
# 二维背包
dp = [[0]*(n+1) for _ in range(m)]
for i in range(costs[0],(n+1),1):
dp[0][i] = values[0]
for i in range(1,m):
for j in range((n+1)):
if j < costs[i]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-costs[i]] + values[i])
print(dp[m-1][n])
# print(input())
m, n = map(int, input().split(" "))
costs = list(map(int, input().split(" ")))
values = list(map(int, input().split(" ")))
# 一维背包
dp = [0] * (n+1)
for i in range(m):
for j in range(n,costs[i]-1,-1):
if j >= costs[i]:
dp[j] = max(dp[j], dp[j-costs[i]] + values[i])
print(dp[n])
416. 分割等和子集
leetcode 416. 分割等和子集
代码随想录
找是否有满足sum(nums)/2的组合,最终的容量和价值都为这个值。
class Solution:
def canPartition(self, nums: List[int]) -> bool:
num_sum = sum(nums)
target = 0
if num_sum%2 != 0:
return False
else:
target = int(num_sum / 2)
dp = [0] * 10001
for i in range(len(nums)):
for j in range(target, nums[i]-1, -1):
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
if dp[target] == target:
return True
return False