有N件物品和一个容量为V的背包。第i件物品的价值是C[i],重量是W[i]。求解将哪些物品装入背包可使价值总和最大。
输入第一行数 N V (1 <=N <=500) (1<= V <= 10000)
输入 N行 两个数字 代表 C W (1 <= C <= 50000, 1 <= W <=10000)
输出最大价值
5 10 8 6 10 4 4 2 5 4 5 3
19
1 1 10 2
0
import sys # n: 物品数量 cap: 背包容量 n, cap = list(map(int, input().split())) # values: 物品价值 weights: 物品重量 values, weights = [], [] for _ in range(n): v, c = list(map(int, input().split())) values.append(v); weights.append(c) # 初始化 dp dp = [values[0] if c >= weights[0] else 0 for c in range(cap)] # 迭代 dp for i in range(n): for c in range(cap-1,weights[i]-1, -1): dp[c] = max(dp[c], dp[c - weights[i]] + values[i]) print(dp[-1])
# python版递归解法 n, v = map(int, input().split()) C , W = [], [] for i in range(n): c, w = map(int, input().split()) C.append(c) W.append(w) total = 0 maxval = 0 def dfs(v, C, left): global maxval global total if left==[]&nbs***bsp;min(left)>v: if maxval>total: total = maxval return for i in range(len(left)): if left[i]<=v: v-=left[i] maxval+=C[i] temp_left = left[:] temp_C = C[:] temp_left.pop(i) temp_C.pop(i) dfs(v, temp_C, temp_left) maxval-=C[i] v+=left[i] dfs(v, C[:], W[:]) print(total)