受y总算法基础课启发,稍作修改后的python版本
每块金子有一定的价值wi和体积vi,每件物品只能选择一次,在一定的背包体积下选择出最大的价值组合。
此处注意:
多重背包问题,是每个物品有有限个,并且每个物品的个数限制题目会给出。
完全背包问题,是每个物品有无限个。
分组背包问题,是每一组里面只能选择一个物品。
对于每一个物品,在背包容量满足的情况下,我们都有选或不选两种决策。
定义状态方程:
f[i][j] = f[i-1][j]#不选择第i个物品
f[i][j] = f[i-1][j-v[i]] + w[i]#选择第i个物品
选择二者中间最大的即可。
完整代码:
n ,v = map(int,input().split())
list = []
for i in range(n):
ni,vi = map(int,input().split())
list.append((ni,vi))
f =[ [0 for i in range(100)] for j in range(100)]
for i in range(1,n+1):
for j in range(1,v+1):
if j<list[i-1][0]:
f[i][j] = f[i-1][j]
else:
f[i][j] = max(f[i-1][j],f[i-1][j-list[i-1][0]] + list[i-1][1])
print(f[n][v])
总之,注意一点即可,f[i][j]是前i个物品中,背包体积为j的条件下,所能存储的最大价值