01分数规划解决分数最值问题
0/1 分数规划
算法细节
分数规划通常用来求一个形如 $ a_i, b_i, w_i \in {0,1} $,最小化或最大化 $ \displaystyle\frac{\sum_{i=1}^{n}a_i\times w_i}{\sum_{i=1}^{n}b_i\times w_i} $
对于这类问题第一步显性转化就是对答案进行二分,然后化简为 $ \sum_{i=1}^{n}w_i\times (a_i - mid\times b_i) \geq 0$ 的形式 (这里以求最大值为例)
那么对于这个数学式子就可以结合多个模型性质以及算法来进行求解,这里通过几个例题来说明
例题说明
Dropping tests
有 $ n $ 个物品,每个物品有两个权值 $ a $ 和 $ b $。
你可以选 $ n-k $ 个物品 $ p_1,p_2,\cdots,p_{n-k} $,使得 $ \displaystyle\frac{\sum a_{p_i}}{\sum b_{p_i}} $ 最大。
进行二分后不难发现我们只需要贪心的选择 $ n - k $ 个最大的 $ a_i - mid * b_i $ 就可以了
Beautiful Path
题目所提供的图是一张拓扑图,所以在二分后我们可以直接在图上进行简单线性 $ dp $ 即可
[USACO18OPEN] Talent Show G
对于所选物品,多出了一条对于体积的限制,所以无法进行贪心求解。通过观察到 $ W $ 的限制较小,那么就可以通过01背包求出最大值,$ dp_j $ 代表前 $ i $ 头牛中体积为 $ j $ 的最大值,当然这里我们只需要体积超过 $ W $ 的最大值,所以超过 $ W $ 的值可以和 $ dp_w $ 取一个最大值就可以节省空间
HNOI2009 最小圈
这里我们可以理解为 $ a_i = c_i, b_i = 1 $,那么我们想要的就是知道是否存在一个圈 $ j $ 使得 $ \sum_{i\in cycle_j}^{}(c_i - mid) < 0 $,那么我们不妨建立一个以 $ c_i-mid $ 为边权的图,查询这个图内是否存在负环即可,复杂度为 $ O(nmlogn) $
「JSOI2016」最佳团体
是jyy老师出的题目?
题目暗示出给出的关系图是一个以 $ 0 $ 号点为根的树,那么对于转化后的问题就是一个裸的树上背包问题,那么难点就是在于如何在 $ O(n^2) $ 的时间复杂度内实现树上背包,这里就不过多赘述了。当然这题的时间限制较为严格,需要分析好上下界

浙公网安备 33010602011771号