Description
题目链接:BZOJ 4753
有 $N$ 名候选人,从 $1$ 到 $N$ 编号,队长编号为 $0$,每个候选人都由一位编号比他小的候选人推荐(如果为 $0$ 则表示是队长推荐的)。队长希望招募 $K$ 个人,但是他需要保证:如果招募了 $x$,那么他的推荐人也要招募(队长总是在团队里的)。每个人都有代价 $C_i$ 和价值 $W_i$ 两个值,招募可以获得的价值为 $\frac{\sum W_i}{\sum C_i}$,你需要最大化这个值,答案保留 $3$ 位小数。
数据范围:$1\le K\le N\le 2500$,$1\le C_i,W_i\le 10^4$
Solution
先做一个小转化:以 $0$ 为根节点,选择 $K+1$ 个点,其中根节点必须选择。
首先我们考虑树形 $\text{DP}$,显然是一道普通的树上背包问题。但是由于答案是一个比值,无法记录状态进行转移,所以我们引入 $01$ 分数规划。
这个式子显然是可以二分答案的,因此可以得到
由于分母是正数,我们将式子拆开
可得
故我们可以二分答案 $x$,将问题转化为:每个点有 $1$ 个属性 $P_i=W_i-x\times C_i$,能否使选取的点的属性和大于等于 $0$。
设计状态:$f[i][j]$ 表示在以第 $i$ 个节点为根的子树中,选择 $j$ 个节点的最大属性和。
$\text{DP}$ 为朴素的树上背包问题,转移非常显然(注意根节点 $i$ 对应的 $j$ 至少为 $1$,我就因为这个调试了半天)。
注意初始化:$f[i][0]=0$,$f[i][1]=W_i-x\times C_i$,其余状态的值均为无穷小。
时间复杂度:$O(N^2)$(复杂度证明见 「HAOI 2015」树上染色)
Code
1 |
|