一、基本的01背包
def Bags_01(value,weight,n):
m = len(value)
# dp[i][j]:从物品0~i中挑选,对于背包重量为j,所能得到的最大价值
dp = [[0] * n for _ in range(m)]
for i in range(m):
dp[i][0] = 0
for i in range(weight[0],n):
dp[0][i] = value[0]
print(dp)
for i in range(1,m):
for j in range(1,n):
if j < weight[i]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
print(dp)
return dp[-1][-1]
print(Bags_01([15,20,30],[1,3,4],4))
- dp数组含义: dp[i][j]:从物品0~i中挑选,对于背包重量为j,所能得到的最大价值(在解题时如果觉得比较绕可以把这个解释写在注释里)
- 递推公式:对于背包容量为j时,dp[i][j] = max(装物品i,不装物品i)
- 不装物品i:dp[i][j] = dp[i-1][j]
- 装物品i:dp[i][j] = dp[i-1][j-weight[i]]+value[i]
- 注意装物品i的前提条件是当前背包容量j > 当前物品i的重量weight[i],否则不用考虑装不装物品i,直接为不装物品i的情况
- 初始化:由递推公式可得,后面的对某个dp[i][j],它由它上面或者左上角的数据