算法学习(四)——完全背包、多重背包

算法学习(四)——完全背包、多重背包

完全背包

对于背包问题的初步认识,可以参考我的另一篇文章
算法学习(三)——01背包

题目类型

N N N 件物品和一个容量为 V V V 的背包。第 i i i 个物品的价值和体积分别是 v a l u e [ i ] value[i] value[i] w e i g h t [ i ] weight[i] weight[i] 。每个物品能无限制的使用任意个。求解将哪些物品放进包里可以使价值最大。

题目类型

大体和01背包类似,唯一不同的地方是每种物品有无限个。此时每种物品的策略已经不再是要或者不要了,而变成了要0个,要1个,要2个……

状态表达式和状态转移方程

状态表达式方面和01背包是一样的,依旧用 t a b [ i ] [ j ] tab[i][j] tab[i][j] 去表示前 i i i 个物品恰好放入一个容量为 j j j 的背包的最大价值。我们就可以很容易的按照原本的思路,写出状态转移方程:
tab[i][j] = max{ tab[i-1][j-k*weight[i]]+k*value[i] | 0<=k*c[i]<=v}

状态转移方程理解

看到上面的状态转移方程和往常一样,懵了,不过有了01背包的基础,我还是可以冷静下来分析分析这个状态转移方程的:

注意状态转移方程最后有一个 0 &lt; = k ∗ w e i g h t [ i ] &lt; = v 0 &lt;= k * weight[i]&lt;= v 0<=kweight[i]<=v ,即物品重量要在背包重量范围内,当然,这是肯定的。
其实这个状态转移方程就是在01背包的基础上增加了一个变量 k k k ,在写代码的时候加上 k k k 其实就好了。
查了很多很多的教程,都没有对于完全背包的状态转移方程的详解,都是自己一点一点琢磨出来的。不过查教程的时候发现这个状态转移方程虽然是核心,但是使用的时候好像都是它的变形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值