算法学习(四)——完全背包、多重背包
文章目录
完全背包
对于背包问题的初步认识,可以参考我的另一篇文章
算法学习(三)——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 < = k ∗ w e i g h t [ i ] < = v 0 <= k * weight[i]<= v 0<=k∗weight[i]<=v ,即物品重量要在背包重量范围内,当然,这是肯定的。
其实这个状态转移方程就是在01背包的基础上增加了一个变量 k k k ,在写代码的时候加上 k k k 其实就好了。
查了很多很多的教程,都没有对于完全背包的状态转移方程的详解,都是自己一点一点琢磨出来的。不过查教程的时候发现这个状态转移方程虽然是核心,但是使用的时候好像都是它的变形。