Banson's Blog
完全背包

问题描述

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

状态函数及其转移方程

下面直接贴出最终版。

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

f[i][j]=max{f[i1][j],f[i][jw[i]]+v[i]}

疑难解释

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

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

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

总结

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

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


Last modified on 2020-05-14