Skip to content

Latest commit

 

History

History
85 lines (43 loc) · 2.71 KB

背包 DP.md

File metadata and controls

85 lines (43 loc) · 2.71 KB

背包 DP

规定 $w$ 序列表示开销,$v$ 序列表示价值。

0-1 背包

$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 樱花

Refrences

背包 DP - OI Wiki