题解 | #【模板】01背包#
【模板】01背包
https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e
import sys
while True:
try:
n, V = map(int, input().split())
lv, lw = [], []
for i in range(n):
l = list(map(int, input().split()))
lv.append(l[0])
lw.append(l[1])
dp = [0 for _ in range(V + 1)]
dp2 =[float("-inf") for _ in range(V+1)]
dp2[0] =0
for i in range(n):
#通过打印dp数组观察,倒序遍历能保证每个物品只用一次,
for j in range(V, -1, -1):
if lv[i]<=j:
#print(lv[i],j)
dp[j] = max(dp[j], dp[j - lv[i]] + lw[i])
dp2[j] = max(dp2[j], dp2[j-lv[i]]+lw[i])
#print(dp)
#print(dp2)
print(max(dp))
print(dp2[-1] if dp2[-1]!=float("-inf") else 0)
# print(dp)
# print(dp2)
# for i in range(n):
# for j in range(V+1):
# if lv[i]<=j:
# dp[j] = max(dp[j], dp[j - lv[i]] + lw[i])
# #dp2[j] = max(dp2[j], dp2[j-lv[i]]+lw[i])
# print(lv[i],j)
# print(dp)
except:
break


查看10道真题和解析