例题
有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的耗费的空间是Ci,得到的价值是Wi。求解:将哪些物品装入背包,可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。
分析
完全背包和01背包的区别就在于物品可以无限取,而01背包的每种物品只有一件(01背包可以参考我之前的文章);
若按照01背包的思路来求解的话:也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……直至取⌊
V
C
i
\frac{V}{C_i}
CiV⌋件等很多种。那么可以转化为01背包的问题,假设每个物品有⌊
V
C
i
\frac{V}{C_i}
CiV⌋件再通过01背包的动态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
来解
但是这样做有一个问题:虽然这跟01背包问题一样有O(V N)个状态需要求解,但求解每个状态的时间已经不是常数了,求解状态F[i; v]的时间是O(
V
C
i
\frac{V}{C_i}
CiV),总的复杂度可以认为是O(
N
V
−
V
C
i
NV - \frac{V}{C_i}
NV−CiV),是比较大的(此时
N
=
V
C
i
N=\frac{V}{C_i}
N=CiV)。
那么优化就来啦:还记得01背包优化空间复杂度的优化方法吗?这种方法逆推的原因为的就是防止物品被重复选取,则顺推的时候顺便就可以解决掉这个问题.