完全背包问题(动态规划)小结

一,问题

【问题】

一个容量为m公斤的背包。现有n种物品,每种物品有无限多件,它们的重量分别为W[i](1<=

i<=n),它们的价值分别为C[i](1<=i<=n)。求能放入背包的最大价值。

【输入】

第一行:两个整数,n(物品数量,n<51)和m(背包容量,m<201)。

第2,3.......n+1行:每行两个整数W[i],C[i],表示每个物品的重量和价值。

【输出】

一个数,表示最大价值。

【样例输入】

3    6

2 3

4 7

3 6

【样例输出】

12

二,解答思路

动态规划的一般步骤:

1.确定状态变量(函数);

2.确定转移方程(递推关系);

3.确定边界条件

4.确定递推顺序

最大价值物品数量 i背包容量 j 的函数。

设函数 f[i][j] 表示前 i 件物品放入容量为 j 的背包的最大价值。

最终的最大价值就是物品数量 i 从0增长到 n,背包容量 j 从0增长到 m 时的 f[n][m]值。

若当前背包容量为 j ,那我们就要考虑第 i 件物品能否放入是否放入

1,当前背包容量 j<W[i], 不能放入,则 f[ i [ j ]=f[ i-1 ][ j ];

2,当前背包容量 j>=W[i],能放入,但要比较价值:

(1)若第 i 件物品不放入背包,则 f[ i ][ j ]=f[i-1][ j ];

(2)若第 i 件物品放入背包,则f[ i ][ j ]=f[ i ][ j-W[ i ] ]+C[ i ]

对于前 i 件物品,背包容量为 j-W[i] 时可能已经放入了第 i 件物品,容量为 j 时还可以放入第 i 件物品,所以用 f[ i ][ j-W[i] ]更新 f[ i ][ j ]

为方便理解,举个例子:

三 ,代码

 

 我们还可以做进一步的优化:

一维数组 f[ j ] 只记录一行数据。让 j 值顺序循环,顺序更新 f[ j ] 的值。

 

 为什么呢?因为 j 是顺序循环,f[ j-w[i] ]会先于 f[ j ] 更新,也就是说,用 新值 f[ j-w[i] ] 去更新 f[ j ],相当于用第 i 行的 f[ j-w[i] ] 的值更新 f[ j ],所以可以。

相比有人已经意识到了,还可以做进一步地简化

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别抢我的辣条~

老板大气!祝老板身体健康!!!

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

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

打赏作者

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

抵扣说明:

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

余额充值