解题报告-论对“依赖背包”的新理解

解题报告-论对“依赖背包”的新理解

依赖背包的依赖关系组成一棵树。那么为什么不能按照树形 \(\text{DP}\) 的方式来思考它呢?

这是个模板题。既然我们说了按照树形 \(\text{DP}\) 的方式思考它,就要打破常规的 \(\text{DP}\) 思维。

树形 \(\text{DP}\) 的特点之一就是考虑每个子树内的问题,然后由子树转移到父节点。

照常,我们先考虑大树的限制:\(V\),也就是背包容量。那么,对于每个子树的子问题处理,都应该是建立在这个限制条件下的。

众所周知,依赖背包是树形 \(\text{DP}\)+背包,所以我们的 \(dp\) 状态既要包含背包的特点,又要包含树形 \(\text{DP}\) 的特点。

\(dp_{u,j}\) 表示在 \(u\) 的子树内,背包容量为 \(j\),能够买到物品的最大价值。转移的时候,依次考虑 \(u\) 的每个儿子 \(son\),再依次考虑所有状态 \(j\),最后依次考虑给这个儿子的体积 \(k\),然后转移即可。时间复杂度 \(O(nV^2)\)。(最后要算上 \(u\) 本身这个结点。)

for(son)
    for(j=V-w[u]...0)
        for(k=0...j)
            dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[son][k]);

实际上,如果 \(O(nV^2)\) 的算法无法通过这样的题,我们一定有其他的算法来做这样的题,比如二进制枚举

posted @ 2024-12-07 11:22  KarmaticEnding  阅读(41)  评论(0)    收藏  举报