参考自:https://www.cnblogs.com/fengziwei/p/7750849.html
以下代码中的w是每个物品的重量,v是每个物品的价值
01背包
w = [0] + list(map(int, input().split()))
v = [0] + list(map(int, input().split()))
top = int(input())
n = len(w)
d = [[0] * (top + 1) for _ in range(n + 1)]
for i in range(1, n):
for j in range(top + 1):
if w[i] > j:
d[i][j] = d[i - 1][j]
else:
d[i][j] = max(d[i - 1][j], d[i - 1][j - w[i]] + v[i])
print(d[n - 1][top])
完全背包
完全背包和01背包的区别在于每个物品的数量是无限多的,可以重复选取,因此只需要把上面的代码中
d[i][j] = max(d[i - 1][j], d[i - 1][j - w[i]] + v[i])
修改为
d[i][j] = max(d[i - 1][j], d[i][j - w[i]] + v[i])
这意味这第i件物品可以被重复选取
完整代码
w = [0] + list(map(int, input().split()))
v = [0] + list(map(int, input().split()))
top = int(input())
n = len(w)
d = [[0] * (top + 1) for _ in range(n + 1)]
for i in range(1, n):
for j in range(top + 1):
if w[i] > j:
d[i][j] = d[i - 1][j]
else:
d[i][j] = max(d[i - 1][j], d[i][j - w[i]] + v[i])
print(d[n - 1][top])
空间压缩为1维数组
简单地说,01背包空间压缩只需要把内循环改为从后向前遍历即可;而完全背包只需要从前向后遍历。