Problem
给一颗树,每个节点有两个权值$a_i,b_i$。
要求选出k个节点,使$\frac{\sum{a_i}}{\sum{b_i}}$尽可能大。
限制条件:当且仅当该点的父亲已经被选择时才可以选择这个节点。
$n\leq2500$
Solution
最近右边大佬学了分数规划,怒A五道神题后热血沸腾的向我详细讲了分数规划的实现。
基本实现大概是这样的:
假设我们知道答案,那么原式子可以化成:
所以我们只需先二分答案,再给每个物品附一个权值$v_i=a_i-b_i*ans$然后判断能否选出k个物品使$\sum v_i>0$即可。
这道题的话……只是多套一个树形依赖背包就可以了。
反正每写过树形依赖背包的博客,就在这讲一下吧……
设$dp_{i,j}$表示以i为根的子树内选择j个点的最优解。
转移的话……对于每个儿子节点,枚举从儿子的子树中选择多少个节点,直接转移即可。
也可以像右边大佬一样用下面的式子转移
其中$sz[i]$为$i$的子树大小。
最后的答案为$dp[0][m+1]$关于为什么是这个……请看原题面
Code
1 |
|