完全背包
什么是完全背包 完全背包,就是在背包容量有限的情况下,每件物品可以选无数多件。 如何求解完全背包 完全背包和01背包一样,拥有最优子结构。所以也可以用动态规划来解。 还是先确定动态转移方程,把01背包的转移方程进行发展,可以得到 f(n,m)=max{f(n-1,m-k×w[n] )+k×v[n] │ 0≤k×w[n]≤M} K表示选k件n类物品。其实01背包也可以用这个递推式来解的,只是k非0即1。 优化动态转移矩阵 如何优化这个转移矩阵呢?我们先回顾一下01背包是怎么优化的?我们把二维矩阵优化成一维数组,但是在计算时m要逆序。为怎么呢?因为第n件物品是不能复选的。 那我们在来看看如果m不逆序会发生什么? 我先们来看看“上次计算的结果”是什么呢?“上次计算的结果”无非是两种情况 f[n-2][m] 或者是 f[n-2][m-w[n-1] ]+v[n-1] 先考虑 第二种情况叠加 的情况,就会发现。。。我们根本没法叠加。但是如果我们把转移式改成 f[n][m]=max{f[n-1][m],f[n][m-w[n]]+v[n]} 就可以叠加了(就是后面那个n不减了)。结果发现这和 f(n,m)=max{f(n-1,m-2×w[n] )+2×v[n]} 是等价的。那不就正好达到了取2件i物品的目的吗。在这样叠加上去,就和取k件i物品就等价了。这时候你可能会产生这样一个问题