题目传送门
分析:
看到这个限制条件构成了一个树形结构,相当于儿子节点的生产数一定不小于父亲节点,且不比父亲节点多超过\(D\)个
差分一下,如果一个节点要制造物品,那么其子树内的节点全部都制造一个物品,非根节点最多造\(D\)个物品
效果相同,并且将每个节点的代价和收益变为子树和,我们就可以脱离树形结构直接多重背包了
但是\(D\leq 10^9\)不能够枚举
我们回到最开始学动规背包时,相想必大家在解决背包问题时一定想过一个贪心:
一个物品重量为\(w\),价值为\(v\),我们把物品按\(\frac{v}{w}\)从大到小排序,贪心加入
这样做会在当背包剩余空间不够大的时候出现问题,相信大家也把自己驳倒过
但是在背包空间足够大时,这样的做法就没有问题
我们可以在背包空间不够大的时候做多重背包,剩余的体积用于贪心加入物品
假设有两个物品\(i,j\)满足\(\frac{v_i}{w_i}>\frac{v_j}{w_j}\),那么在收益相等(选了\(v_j\)个\(i\),选了\(v_i\)个\(j\))的情况下,选\(v_j\)个\(i\)显然会更优
从而在比\(\frac{v_i}{w_i}\)大的物品还能加的时候,比\(\frac{v_i}{w_i}\)小的至多会选\(v_i-1\)个
我们这道题一个点的\(v\)为子树和,最大为\(n\)
相当于做背包的每种物品最多有\(min(n,D)\)个,背包体积最大为\(n^3\)
使用二进制分组优化一下,复杂度可以接受
剩下的暴力加入就好了
总复杂度\(O(n^4logX)\)
#include
#include
#include
#include
#include
#include
#include
#include