概念
泛化物品优化树上背包是一种利用”泛化物品”思想来优化 树上背包 DP 时间复杂度的技巧。树上背包的朴素做法是对树上每个节点做背包合并,总时间复杂度为 ( 为节点数, 为背包容量)。通过泛化物品的合并方式,可以将复杂度优化到 。
核心思想
泛化物品
在背包问题中,一个”泛化物品”可以看作一个函数 ,表示分配费用 时能获得的最大价值。普通的 0-1 物品、完全背包物品都是泛化物品的特例。
两个泛化物品 和 的合并定义为:
这是一次 的卷积操作。
树上背包的优化
树上背包的关键观察是:朴素合并中,每个节点需要与所有子树逐一做背包合并。如果不加优化,外层枚举子树、内层枚举容量,看似是 。但利用以下性质可以证明复杂度实际为 :
- 每对节点 在合并过程中最多贡献一次计算——当且仅当在它们的 LCA 处合并时。
- 因此总的合并操作量等价于所有节点对的贡献之和,为 。
具体实现时,按 DFS 序处理子树,依次将每个子节点的泛化物品与当前节点的结果合并即可。
时间复杂度
| 方法 | 时间复杂度 |
|---|---|
| 朴素树上背包 | (未优化枚举上界时) |
| 泛化物品优化 |
适用场景
- 树形依赖背包问题(选择某个物品前必须选择其父节点)
- 树上分组背包、树上多叉背包
- 需要在树结构上做背包 DP 且 较大的场景