python背包问题求最大价值 | 动态规划

背包问题–问题描述

在这里插入图片描述

解决步骤

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])
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码魔法师!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值