第一行输入两个整数
和
,分别表示物品数量与背包容量。
此后
行,第
行输入两个整数
,分别表示第
件物品的体积与价值。
输出两行:
第一行输出方案
的答案;
第二行输出方案
的答案(若无解输出
)。
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])