算法之动态规划(DP)求解完全背包问题

本文详细介绍了如何使用动态规划算法解决完全背包问题。完全背包与01背包的主要区别在于物品可以取无限次。文章通过状态和状态转移方程的推导,展示了完全背包的动态规划解决方案,并给出了优化后的代码实现,包括白银级、铂金级和王者级的优化。最后,通过16行代码简洁地解决了完全背包问题。

算法之动态规划(DP)求解01背包问题
上面这篇文章主要讲解了01背包问题和动态规划算法,如果你不了解动态规划算法,建议先浏览一下这篇文章熟悉一下,因为,本文的算法思想是基于这篇文章的。

1、什么是完全背包问题?

01背包问题:有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少?

完全背包 :有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和最大是多少?

01背包问题和完全背包问题的区别就在于,每个物品取的最大次数是1次还是无限次。

2、动态规划的状态和转移方程

参考01背包的状态和转移方程,来推导完全背包的状态和转移方程。

01背包问题的状态和转移方程:

状态: f[i][j]  选择前i个物品,体积为j时的最优方案,即所选物品的最大权重和。
状态转移:f[i][j] = max(f[i-1][j-v[i]]+w[i], f[i-1][j]) 

现在物品可以取无数次,那么f[i][j]怎么构造合适呢?
完全背包,有N个物品,背包容量V,最终求解背包的最大权重,因此,完全背包和 01背包这些都一致,因此,状态一致。f[i][j] 选择前i个物品,体积为j时的最优方案,即所选物品的最大权重和。

状态转移方程如何构造呢?
01背包问题每次增加第i物品时,因为只能取一次,从j中减去v[i],再加上w[i],这个操作只进行了一次。现在可以增加无数次,大家想想,怎么做呢?

大家可以留出5秒钟的时间来思考…

时间到,聪明的朋友肯定想到了,第i个物品可以增加0次(即f[i-1][j]),增加1次,增加2次,增加3次…增加k-1次,(这里k*v[i] > j),然后求所有值的最大值作为f[i][j]的值。
因此我们可以写出状态和状态转移方程:

状态: f[i][j]  选择前i个物品,体积为j时的最优方案,即所选物品的最大权重和。
状态转移:f[i][j
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值