代码:
def knapsack(n):
max_c = n # 背包的容量
w = [0, 2, 3, 4, 5, 9] # 商品的重量
v = [0, 3, 4, 5, 8, 10] # 商品的价值
B = [[0]* (max_c+1) for i in range(len(w))] # B[K][C]的所有取值的数组
for k in range(1, len(w)): # 逐个计算B[k][C]的值
for C in range(1, max_c+1):
if w[k] > C: # 当前选择的第k个物品的重量大于容量
B[k][C] = B[k-1][C]
else:
value1 = B[k-1][C] # 可以容纳当前商品的重量,但是不选当前商品
value2 = B[k-1][C-w[k]] + v[k] # 选择当前商品
B[k][C] = max(value1, value2)
return B[-1][-1]
print(knapsack(20)) # 假设背包的容量(此处为20)不足以装下所有的物品, 则有最大值。
>>> 26
print(knapsack(89)) # 假设背包容量足以装下所有的物品,则背包价值恒定,其值为商品价值之和。
>>> 30
只要了解以下图片就可以了解背包过程:
个人笔记: