规定 $w$ 序列表示开销,$v$ 序列表示价值。
设 $dp_{i,j}$ 为在只能放前 $i$ 个物品的情况下,容量为 $j$ 的背包所能达到的最大总价值。
考虑转移。假设当前已经处理好了前 $i-1$ 个物品的所有状态,那么对于第 $i$ 个物品,当其不放入背包时,背包的剩余容量不变,背包中物品的总价值也不变,故这种情况的最大价值为 $dp_{i-1,j}$;当其放入背包时,背包的剩余容量会减小 $w_i$,背包中物品的总价值会增大 $v_i$,故这种情况的最大价值为 $dp_{i-1,j-w_i}+v_i$。
所以
$$dp_{i,j}=\max(dp_{i-1,j},dp_{i-1,j-w_i}+v_i)$$
考虑滚动数组优化
$$dp_j=\max(dp_j,dp_{j-w_i}+v_i)$$
这样的时间复杂度是 $O(nW)$。
枚举时循环是逆向的。
P1417 烹调方案
P2871 [USACO07DEC] Charm Bracelet S
与 0-1 背包的主要区别是一个物品可以选取 $m_i$ 次,在 0-1 背包的基础上枚举每个物品买的次数即可。
朴素转移方程如下:(滚动数组优化)
$$dp_j=\max\limits_{k=0}^{m_i}{dp_{j-k\times m_i}+k\times v_i}$$
这样的时间复杂度是 $O(nW\sum m_i)$。
考虑优化,发现我们重复选择了很多次相同的物品,那么是否可以把一个物品拆分为多个子物品考虑呢?
可以按 $2^0,2^1,2^2\dots$ 的顺序拆分,多余的物品单独放在一个子物品里。问题转化为普通的 0-1 背包。
时间复杂度便优化到 $O(nW\sum \log_2m_i)$。
P1776 宝物筛选
与 0-1 背包的主要区别是一个物品可以选取无限次,在 0-1 背包的基础上枚举每个物品买的次数即可。
朴素转移方程如下:(滚动数组优化)
$$dp_j=\max\limits_{k=0}^{+\infty}(dp_j,dp_{j-k\times w_i}+v_i\times k)$$
这样的时间复杂度是 $O(n^2W)$。
考虑优化,发现 $dp_j$ 可以只从 $dp_{j-w_i}$ 转移:(滚动数组优化)
$$dp_j=\max(dp_j,dp_{j-w_i}+v_i)$$
时间复杂度便优化到 $O(nW)$。
枚举时循环是正向的。
P1616 疯狂的采药
P5662 [CSP-J2019] 纪念品
一些物品可以选一次,一些物品可以选无限次,还有一些物品可以选一定次。
解法是分类讨论。
P1833 樱花
背包 DP - OI Wiki