[Note] 背包DP
[L4] 背包DP
1. 生态位
-
识别:
-
决策: 面对一组离散物品,需对每个物品做出选/不选或选多少的决策。
-
限制: 决策受限于一个或多个物理维度(容量、负重、体积),无法无限叠加。
-
目标: 目标通常是总价值最大化或特定状态的可达性。
-
-
地位: 动态规划的基础模型,是后续学习数位 DP、状压 DP 的前置。
-
用途: 最优化决策,资源分配,可行性判断。
2. 逻辑支点
2.1 核心原理
背包问题的本质是在有限的容量轴上进行决策填充。
最经典的滚动数组背包循环方向中,其实就暗含着对物品的复用性定义。
二者都是通过 来更新 ,但得到的结果完全不同。
-
倒序循环:,这种情况下 是上一个物品的状态,每个物品只会对当前层产生一次影响 0/1 背包。
-
正序循环:,这种情况下 是这一轮中刚刚被更新的状态,每个物品会多次更新累积 完全背包。
2.2 变种模型
-
多重背包,第 个物品有 个。
- 朴素解法,暴力计算 个独立的 0/1 背包,复杂度爆炸 。
- 优化1:二进制拆分,把 个物品拆解为 个合成物品,降维。
- 优化2:单调队列同余系优化,用的不多,证明略,复杂度是线性的。
-
分组背包,每组物品最多选一个。
- 逻辑:,从组到容量(倒序),再到组内物品。
- 关键:循环顺序不能乱,不然就会违背无后效性。
-
依赖背包,物品之间有依赖关系。
- 简单的依赖关系可以通过转化为分组背包。
- 但复杂的依赖关系就需要采用树形背包求解了。
2.3 广义背包
当我们把视野从 背包 和 物品 本身移开,我们会发现背包模型的本质是:代价和收益的博弈。()
只要满足以下特征的问题,都可以是广义背包:
- 资源限制:存在一个消耗品(时间,步数,兵力,钱……)。
- 阶段独立:过程可以划分为若干个独立 的阶段(城堡,关卡,物品组……)。
- 决策离散:每个阶段中有若干互斥的操作。
从这个角度再回顾背包问题,你就会发现广义背包不止局限于背包。
3. 实战部署
1 | |
多重背包的单调队列优化
当数量上限很大而容量维仍需逐格处理时,可以把同余容量重新编号为状态链。P1776 的完整推导、上一层状态隔离和实现见 单调队列优化 DP 模型,本页只保留二进制拆分与分组背包的通用模板。
4. 知识关联
-
实战案例:
-
状态可达性判定: P5020 货币系统
-
混合背包: P1941 飞扬的小鸟 完全背包 + 0/1 背包。
-
互斥分组背包: P5322 排兵布阵 广义背包的典例。
-
前后缀分析: ABC441F Must Buy 前后缀背包,快速计算强制选/不选某个物品
-
依赖背包: P1064 金明的预算
-
BFS 预处理代价: ZJ2021J Grammy and Jewelry 图论中的广义背包。
-