截图均来自卜老师的《算法讲义》
问题描述
伪代码
表格的最后一个值即为最大价值,回溯可以得到最优解决方案
python实现
# -*- coding:utf-8 -*-
import numpy as np
def knapsack(n, w, v):
opt = np.zeros((n+1, w+1))
for i in range(1, w + 1):
opt[0][i] = 0
for j in range(1, n + 1):
for k in range(1, w + 1):
if v[j-1][0] <= k:
opt[j][k] = max(opt[j-1][k], opt[j-1][k-v[j-1][0]] + v[j-1][1])
else:
opt[j][k] = opt[j - 1][k]
print(opt)
return opt[n][w]
# [[weight, value], [weight, value]]
v = [[2, 2], [2, 2], [3, 3]]
print(knapsack(3, 6, v))
# v = [[2,6],[2,3],[5,6],[5,4],[4,6]]
# print(knapsack(5, 10, v))