完全背包

在昨天我已经很详细的讲解过01背包的动态规划问题了.

先看问题:在n种物品中选取若干件(同一种物品可多次选取)放在空间为v的背包里,每种物品的体积为c1,c2,…,cn,与之相对应的价值为w1,w2,…,wn.求解怎么装物品可使背包里物品总价值最大

看完这个问题,你也许会觉得这个不就是01背包的升级版吗,其实就是这样,完全背包问题与01背包问题的区别在于完全背包每一件物品的数量都有无限个,而01背包每件物品数量只有1个

所以说与它相关的策略已经不是只有取和不取这两种策略了,而是有取0件、取1件、取2件……等等很多种策略

如果我们用和01背包一样的状态,f[i][v]表示前i种物品恰放入一个容量为v的背包的最大价值,那我们应该用k表示当前容量下可以装第i种物品的件数,那么k的范围应该是0≤k≤v/c[i],

既然要用当前物品i把当前容量装满,那需要0≤k≤v/c[i]件,其中k表示件数。

然后有一个式子跟(01背包一样的有一个式子)

下面给出状态转移方程:f[i][j] = max{f[i][j],f[i-1][j - k * c[i]] + k * w[i]}(0<=k*c[i]<=v)

我们可以对其进行优化:如果有两件物品a、b满足c[a]<=c[b]且w[a]>=w[b],则将物品b去掉,不用考虑。因为你可以用 占用体积小的物品 得到 比 占用体积大的物品还要多的价值,何乐而不为呢。其实对于完全背包,可以再优化,首先将容量大于v的物品去掉,然后排序计算出容量相同的物品中价值最高的是哪个,我们只要价值大的就可以了。

这就是完全背包的基本概念。

 

 

 

 

原文地址:https://www.cnblogs.com/kevin6666/p/10950088.html