学习资料:
题目链接(和上次一样):
使用一维滚动数组代替二维数组。二维数组的解法记录在:
容量为j的背包可以背的物品的最大价值。
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
dp[0] = 0, 根据递推公式,dp[j]取当前和前面的值的最大值,题目给的价值都是正整数,那么非0下标都初始化为0就可以了。
先遍历物品,再从大到小遍历背包。之所以要从大到小遍历,是为了防止物品被重复放入。
e.g. i = 0: dp[1] = 15, dp[2] = max(dp[2] = 0, dp[2-weight[1]] + value[1] = dp[1] + value[1] = 15 + 15 = 30)。 而当从后往前遍历时, i = 0: dp[4] = 15 dp[3] = max(0, dp[2] + value[0]) = max(0, 0 + 15) = 15,是正确的。
二维数组可以从小到大遍历,是因为当前的dp[i][j]不包括当前的物品i,是从[0, i-1]中选取物品。
objNum, bagWeight=map(int,input().split())
weight= [int(i) for i in input().split()]
value = [int(i) for i in input().split()]
dp = [0]*(bagWeight+1)
for i in range(objNum): # 遍历物体
for j in range(bagWeight, 0, -1): #遍历背包容量
if weight[i] > j:
dp[j] = dp[j]
else:
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bagWeight])
因篇幅问题不能全部显示,请点此查看更多更全内容