解題報告-論對“依賴揹包”的新理解
依賴揹包的依賴關係組成一棵樹。那麼為什麼不能按照樹形 \(\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)\) 的演算法無法透過這樣的題,我們一定有其他的演算法來做這樣的題,比如二進位制列舉。