背包问题基础模型深度总结-文长慎入(01背包,完全背包,多重背包)

本文深入探讨背包问题的基础模型,包括0-1背包、完全背包和多重背包。详细阐述了各类背包问题的状态定义、递推关系、优化方法,并介绍了如何通过二进制优化降低时间复杂度。此外,文章还讨论了混合背包问题的解决策略,是理解背包问题的绝佳资源。
摘要由CSDN通过智能技术生成

先等一下,字多预警,密集恐惧症慎入,喂,你,就是你,小板凳搬好了吗,站久了可是会腿酸的

无节操地王婆卖瓜一下, 本文 深度好文

目录

先扯两句

0-1背包

其它类似的状态定义

1

2

小结

3  记忆化搜索

滚动数组(优化空间复杂度)

初始化

完全背包

递推关系

优化时间

滚动数组

简单有效的常数优化

多重背包

状态转移

转化为01背包问题

二进制优化

可行性问题

混合三种背包问题

最后再扯两句

 

 


先扯两句

本篇博文中的数组默认都从1开始。

题目说扯2句,那上一句还不够加上这一句应该够了吧。


0-1背包

之前写过一个0-1背包的博客,总结得还是比较清楚。0-1背包总结

0-1背包是所有背包问题的基础,在0-1背包的基础上有许多变体,许多背包问题也是由它引申而来的,所以很重要(貌似这句话才是重点)

定义dp[i][j]为前i种物品重量恰好为j的最大价值 w[i]为重量 c[i]为价值,则:

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

也很好理解,分别对应当前物品不取和取两种状态

当然这个状态要注意j-w[i]<0时,dp[i][j]只能转移到dp[i-1][j]

其它类似的状态定义

1

定义dp[i][j]为前i件物品重量不超过j的最大价值

dp[i][j]=\left\{\begin{matrix} dp[i-1][j] & j<w[i] & & & & & & & & \\ max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]) & & & & & & & & & \end{matrix}\right.

咦,怎么看起来跟之前的转移一模一样啊,但是这两个都是对的_(:з」∠)_

区别在于初始化的不同处理 这里先卖个关子,后面马上说 qwq

2

定义dp[i][j]为从第i个物品开始挑选重量小于j的最大价值

dp[n+1][j]=0

dp[i][j]=\left\{\begin{matrix} dp[i+1][j] &\\max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]) & \end{matrix}\right.

小结

写递推方式的dp是,不同的状态定义需要用不同的顺序,也就是规划方向

我们在进行状态转移的时候一定要保证被用来转移的状态已经被计算过

如果顺序不好确定或者无法确定,我们可以用记忆化搜索

对,记忆

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值