*AtCoder Regular Contest 096F - Sweet Alchemy

$n \leq 50$的树,每个点有权值,现要选点(可多次选一个点)使点数尽量多,如下限制:选的总权值不超过$C \leq 1e9$;$c_i$表示$i$选的次数,$p_i$表示$i$的父亲,那么$c_{p_i} \leq c_i \leq c_{p_i}+D$,$D \leq 1e9$是给定常数。

看到这种奇怪不等式很讨厌嘛,差分一下,$d_i=c_i-c_{p_i}$,$d_1=c_1$(1是根),$d_i$表示$i$比$p_i$多选多少。这样一来就每个点都要比父亲多,那我的$0 \leq d_i \leq D$就相当于:每次同时把子树$i$的点选一次,不能选超过$D$次。

现在问题:$n$个东西,每个东西有权值$Y_i$(子树大小),有花费$X_i$(子树权值和),除了第一种物品其他都有限制次数$D$,然后要挑东西,问总花费在$C$以内的最大化的权值。

这不是小学生背包题嘛。。诶等等这范围不大对。

$n \leq 50,Y_i \leq 50$,其他可以很大。。。。

好吧。那来看这个新背包题。

依稀记得背包有一种错误的贪心解法:按权值花费比,大的先挑。这样会因为剩余空间的分配不合理导致GG。但从没考虑过它和正确答案的误差。

它之所以错的,就是最优答案里可能去掉了一些看起来好的,选了更多看起来不那么好的。就是说,如果把物品按照性价比从大到小排序,也就是$p<q$时有$Y_p/X_p \geq Y_q/X_q$。然后呢我就可能最优答案$p$少了一点,$q$多了一点。那到底差了多少呢,如果$p$有超过50个没选,$q$选了超过50个,那由于$Y_pX_q \geq Y_qX_p$,我把$X_p$个$q$换成$X_q$个$p$是更好的且花费一样。也就是没有差超过50个。

那我每个物品拿50个出来DP,剩下的贪心不就好了。。现在俩背包,一个把每种东西挑50个(或者D,看大小)个,然后做DP;另一个把剩下东西丢进去,做贪心。

额慢着,第一个背包还是DP不了。。但注意到总权值是$n^3$级别的,可以做一个$n^3*n*log_n$的DP。搞定。

posted @ 2018-04-23 15:31  Blue233333  阅读(500)  评论(0编辑  收藏  举报