背包问题—深入理解原理

背包问题是dp的模型化,是dp中的经典问题,很多dp都有背包的影子在。就算一些cf2000分的题目也有背包问题优化的精髓。

Problem - 1716D - Codeforces

D. Chip Move(DP,优化时间和空间)_小酒窝.的博客-CSDN博客

挂个好题目,就是那个cf2000分的,让我重新巩固了一下背包

以前我只是会默写背包极致优化之后的板子,对背包的原理只有一个模糊的影响。以至于遇到不太板子的题目就不会灵活运用背包问题的精髓求解了。

现在我又重新学习了一下背包问题,悟到了一些以前没察觉到的好东西,所以写博客来分享巩固。

另外,我感觉做类背包的dp一定要细致,把整个二维模型建出来是个好方法(打个表)。

一览无余的图解

虚线表示不取第i件物品,实现表示取第i件物品

完全背包和01背包的本质差别就在于取物品一个是从上一层状态转移,一个是从本层状态转移。

滚动数组优化后还是一样。

一些碎碎概念

01背包

转移方程

这是个纯粹的背包题目。

dp转移已经背的滚瓜烂熟了。但还是有些好东西。

dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);

这是一个两重循环下的转移式子。

精髓就是:第i个物品放入和不放入能不能达到更好的结果,这是取max的原因,因为要判断的放入的地方可不止一个。这是一种靠前面处理过的东西推到后面的思想

滚动数组

dp[j]=max(dp[j],dp[j-v[i]]+w[i]);

其实背包对空间的浪费是很大的,可以感觉出来能进行优化。

为什么要倒序?

因为倒序才能保证每个元素取一个,否则就是完全背包了。

完全背包

dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);

注意这个转移式子和01背包有区别的,是从i-1转移过来的,也就是从已经处理好的下一层中转移过来的。

滚动数组同理,但是是正序处理的。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

繁水682

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

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

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

打赏作者

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

抵扣说明:

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

余额充值