题解 [ARC096F] Sweet Alchemy
预处理出子树的大小重量和,变为一个多重背包问题,$1$ 号点可以取无限次,剩余点最多可取 $D$ 次。设 $u$ 子树大小为 $S_u$,子树重量为 $W_u$,则物品 $i$ 体积为 $W_i$,价值为 $S_i$,发现 $S_i$ 非常小,考虑怎么利用。
一个经典的错误贪心是按照 $\frac{S_i}{W_i}$ 从大到小排序,依次取。考虑这个贪心什么时候是正确的。若 $i<j$,且选了至少 $S_i$ 个物品 $j$,且物品 $i$ 还有至少 $S_j$ 个可选,这必定是不优的,因为可以去掉这 $S_i$ 个物品 $j$,换为 $S_j$ 个物品 $i$,保证价值相同时,代价更小。
因为 $S_i\le n\le50$,于是可以让每个物品保留 $\min(n,D)$ 个做多重背包,二进制分组,最后对于每个体积贪心取即可。注意将体积与价值反过来,否则状态数太大。这样总价值就是 $O(n^3)$ 的了。
时间复杂度 $O(n^4\log n)$。
这个题的启示是在体积或价值有一维较小,一维较大时,可以通过贪心将另一维减小。

浙公网安备 33010602011771号