背包问题–问题描述
解决步骤
1.建立行(物品)-列(容量)矩阵
== w为物品体积矩阵==
首先将背包的容量作为列,物品作为行
当物品1出现时:(体积为3,价值为1)
在背包容量为3时可以装下物品1,此时背包的最大价值为1
2.分析物品2 3 4出现后,矩阵变化
当物品2出现时:(体积为4,价值为5)
背包容量为4时,既可以容纳物品1,也可以容纳物品2,两者只能容纳一个,取两者极大值max价值
背包容量为7时,可以容纳物品1和物品2,两者取和
这里i表示规律情况,括号中表示举例情况
详细分析:在背包容量递增过程中
例如容量为7时,当前物品价值为v[i] (此时即5)
1.选择了第i个物品 (第2个)之后,剩余容量为j-w[i] (7-4)即 3,然后找第i-1个物品(即第1个物品)容量为3时,背包的最大价值为 dp[i-1][j-w[i]]+v[i](此处即6)
2.不选择该物品时,背包最大价值为5
上述两者取极大值 max(5,6),此处取6
当物品3 物品4出现,依次类推可得矩阵
3. 得到状态转移方程
dp[i-1][j]:不选该物体的最大价值
dp[i-1][j-w[i]]+v[i]:选了该物体后剩余空间最大价值+该物体的价值
上述两者取极大值
即 max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
4.在实验过程中,对取极大值的疑问
在测试了前三个物品时,发现dp[i-1][j-w[i]]+v[i],是一直大于dp[i-1][j] 的
我们只取dp[i-1][j-w[i]]+v[i]的数据,在第四个物品出现时,矩阵变化如下:
分析:在第4个物品(体积为7,价值为9)进入容量为9的背包时(即上图红圈部分)
1.若选择该物品,则背包剩余为2,只能容下第4个物品,此时最大价值为9
2.若不选择该物品,dp[i-1][j]为11,即放第三个物品的时候,最大价值为11(因为此时可以放第3个物品和第2个物品,这两个物品的体积总和为11)
综上,取max的操作不可省略
python该背包问题代码
c = 10
w = [3,4,5,7]
v = [1,5,6,9]
n = len(w)
# 建立 n行c列的矩阵
dp = [[0 for i in range(c+1)] for j in range(n+1)]
w.insert(0,0)
v.insert(0,0)
# for i in dp:
# print(i)
for i in range(1,n+1): # i是物体编号
for j in range(1,c+1): # j是背包容量
if (w[i] <= j): # 如果当前物品所需空间 小于等于 j个空间容量
dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
else:
dp[i][j] = dp[i-1][j]
print("最大价值为",dp[n][c])