解释
完全背包模型与 0-1 背包类似,与 0-1 背包的区别仅在于一个物品可以选取无限次,而非仅能选取一次。
我们可以借鉴 0-1 背包的思路,进行状态定义:设$f_{i,j}$ 为只能选前 i 个物品时,容量为 j 的背包可以达到的最大价值。
需要注意的是,虽然定义与 0-1 背包类似,但是其状态转移方程与 0-1 背包并不相同。
过程
可以考虑一个朴素的做法:对于第 i 件物品,枚举其选了多少个来转移。这样做的时间复杂度是 O(n^3) 的。
状态转移方程如下:
$f_{i,j}=\max_{k=0}^{+\infty}(f_{i-1,j-k\times w_i}+v_i\times k)$
考虑做一个简单的优化。可以发现,对于 f_{i,j},只要通过 f_{i,j-w_i} 转移就可以了。因此状态转移方程为:f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i)
理由是当我们这样转移时,f_{i,j-w_i} 已经由 f_{i,j-2\times w_i} 更新过,那么 f_{i,j-w_i} 就是充分考虑了第 i 件物品所选次数后得到的最优结果。换言之,我们通过局部最优子结构的性质重复使用了之前的枚举过程,优化了枚举的复杂度。