为什么01背包要倒着推,完全背包要顺着推

为什么01背包要倒着推,完全背包要顺着推

我忽然发现,这个小学的知识点,额,一直没有弄懂。现在赶快总结一下。

01背包每个物品只能选一次,所以若用\(f[i][v]\)表示前i件物品,恰好放入一个容量为v的背包可获得的最大价值,那么其二维状态转移方程是:\(f[i][v]=max(f[i-1][v], f[i-1][v-c[i]]+w[i])\)。注意是恰好,所以最后还要max一下。也可以不max,那么定义要把恰好去掉,并且\(f[i][v]\)的初始值应当包括\(f[i][v-1]\)

显然01背包可以在空间上优化。采用滚动数组的思想,\(fnow[v]=max(fpre[v], fpre[v-c[i]]+w[i])\)。然而我们平时并不是这样写的,我们把fpre也优化掉了。通过倒推,我们可以让能够推出\(f[v]\)的状态比\(f[v]\)后更新,于是状态转移方程是\(f[v]=max(f[v], f[v-c[i]]+w[i])\)

完全背包的二维转移方程是这样的:\(f[i][v]=max(f[i-1][v], f[i][v-c[i]]+w[i])\)。也就是说自己可以用到自己那一层的状态。所以如果想把第一位优化掉,可以直接顺推。而优化空间后的方程除了推的方向,和01背包是一模一样的。

所以说,01背包和完全背包,之所以推的方向不同,是由于原来的二维方程不同。一维方程正好只是巧合而已。

转载于:https://www.cnblogs.com/MyNameIsPc/p/7782700.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值