第一行输入两个整数
和
,分别表示物品数量与背包容量。
此后
行,第
行输入两个整数
,分别表示第
件物品的体积与价值。
输出两行:
第一行输出方案
的答案;
第二行输出方案
的答案(若无解输出
)。
3 5 2 10 4 5 1 4
14 9
在该组样例中:
选择第
、第
件物品即可获得最大价值
(未装满);
选择第
、第
件物品可使背包体积
恰好装满且价值最大,为
。
3 8 12 6 11 8 6 8
8 0
装第三个物品时总价值最大但是不满,装满背包无解。
要求
的时间复杂度,
空间复杂度。
n,v = map(int,input().split())
vm = []
for i in range(0,n):
vm.append(list(map(int,input().split())))
dp = [[0 for _ in range(v+1)] for _ in range(n)]
dpp = [[-float('inf')]*(v+1) for _ in range(n)]
dpp[0][0]=0
for i in range(0,v+1):
if vm[0][0]<=i:
dp[0][i] = vm[0][1]
if vm[0][0] ==i :
dpp[0][i] = vm[0][1]
for i in range(1,n):
for j in range(1,v+1):
if vm[i][0]>j:
dp[i][j] = dp[i-1][j]
dpp[i][j] = dpp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j],dp[i-1][j-vm[i][0]]+vm[i][1])
dpp[i][j] = max(dpp[i-1][j],vm[i][1]+dpp[i-1][j-vm[i][0]] if dpp[i-1][j-vm[i][0]]!=-float('inf') else -float('inf'))
print(dp[n-1][v])
print(dpp[n-1][v] if dpp[n-1][v]!=-float('inf') else 0) 这个代码有什么问题啊,import sys n, V = map(int, sys.stdin.readline().split()) items = [] for line in sys.stdin: items.append(tuple(map(int, line.split()))) dp1 = [[0 for _ in range(V + 1)] for _ in range(n + 1)] dp2 = [[0 for _ in range(V + 1)] for _ in range(n + 1)] for i in range(1, n + 1): v_i, w_i = items[i - 1] for j in range(0, V + 1): dp1[i][j] = dp1[i - 1][j] dp2[i][j] = dp2[i - 1][j] if j >= v_i: dp1[i][j] = max(dp1[i][j], dp1[i - 1][j - v_i] + w_i) if j == v_i&nbs***bsp;dp2[i - 1][j - v_i] != 0: dp2[i][j] = max(dp2[i][j], dp2[i - 1][j - v_i] + w_i) print(dp1[n][V]) print(dp2[n][V])