题解 | #【模板】完全背包#
【模板】完全背包
https://www.nowcoder.com/practice/237ae40ea1e84d8980c1d5666d1c53bc
import sys
s = input().split()
n, V = int(s[0]), int(s[1])
i = 1
things = []
while i <= n:
things.append(list(map(int, input().split())))
i += 1
dp = [0 for i in range(V + 1)]
#把这里初始化为负无穷,dp2的首个元素初始化为0只有当j=things[i][0]的时候才可以取到dp2等于0的价值,否则的话,dp2永远是无穷和负无穷比较
dp2 = [float("-inf") for i in range(V + 1)]
dp2[0] =0
for i in range(n):
#因为物品i的数量是无限制的,只要背包的容量够,就可以一直加,所以用正序遍历,背包容量,这个时候,dp数组的值可以重复利用,同一个物品可以使用多次
for j in range(V + 1):
if things[i][0] <= j:
#print(things[i][0], j)
#print(dp)
dp[j] = max(dp[j], dp[j - things[i][0]] + things[i][1])
dp2[j] = max(dp2[j], dp2[j - things[i][0]] + things[i][1])
print(max(dp))
print(dp2[-1] if dp2[-1]!=float("-inf" ) else 0)
#print(dp2)
# #print(dp)
# print(max(dp))
# if dp[V]==dp[V-1]:
# print(0)
# else:
# print(dp[V])
查看4道真题和解析