Banson's Blog
完全背包

问题描述

假设有 $i$ 物品,每种数量无限,第 $i$ 种物品质量为$w[i]$,价值为$v[i]$;给定最大承重为V的背包,求可以得到的最大价值。

状态函数及其转移方程

下面直接贴出最终版。

设$f[i][j]$表示考虑前 $i$ 类物品,给定最大承重为 $j$ 的背包可以获得的最大价值,那么有

$$ f[i][j]=\max\{f[i-1][j],f[i][j-w[i]]+v[i]\} $$

疑难解释

$f[i-1][j]$表示根本不取第 $i$ 种物品,这不难理解。难点在于对$f[i][j-w[i]]+v[i]$的理解。为什么只腾出了一个$w[i]$的空间?每种数量不是无限的吗?

仍然采用在01背包使用过的优先思想整体思想。考虑状态$f[i][j]$,它表示考虑前 $i$ 种物品的情况下,背包容量为 $j$ 时所能获得的最大价值。解决这个问题,先决策是否放入第 $i$ 种物品。在考虑放入的情况时,就先放一件,然后把剩余的事情交给 $f[i][j-w[i]]$ 解决,因为它表示的是考虑第 $i$ 件物品时,背包容量 $j-w[i]$的最优解。至于 $f[i][j-w[i]]$ 这个状态中到底有没有/有几件 $i$ 号物品,状态 $f[i][j]$ 并不关心。

归根结底,$f[i][j]$ 的意思是允许放入前 $i$ 种物品。那么状态 $f[i][j-w[i]]$ 所表示的,就是“允许放前 $i$ 种物品,但是削减了一部分空间用来保证第 $i$ 种物品一定入选至少一件,在这种情况下求剩余空间利用的最佳方法”。

总结

无论是01背包,还是完全背包,它们的核心思想都是不变的。即:顺序地考虑物品,但并不是顺序地放入物品。他们都是依次考虑前 $1,2,…,i-1,i$ 种物品,但是对于每一个具体的状态,先决策要不要放入最后一件(种)编号为 $i$ 的再说。

考虑背包问题,一定不能想象成动态的加物品的过程,而是应该对每一个状态都完整地“往空背包里放物品”。所谓“整体考虑”是也。


Last modified on 2020-05-14