分数规划


分数规划用来求一个分式的极值。

形象一点就是,给出 ,求一组 ,最小化或最大化

另外一种描述:每种物品有两个权值 ,选出若干个物品使得 最小/最大。

一般分数规划问题还会有一些奇怪的限制,比如『分母至少为 』。

求解

二分法

分数规划问题的通用方法是二分。

假设我们要求最大值。二分一个答案 ,然后推式子(为了方便少写了上下界):

那么只要求出不等号左边的式子的最大值就行了。如果最大值比 要大,说明 是可行的,否则不可行。

求最小值的方法和求最大值的方法类似,读者不妨尝试着自己推一下。

Dinkelbach 算法

Dinkelbach 算法的大概思想是每次用上一轮的答案当做新的 来输入,不断地迭代,直至答案收敛。


分数规划的主要难点就在于如何求 的最大值/最小值。下面通过一系列实例来讲解该式子的最大值/最小值的求法。

实例

模板

个物品,每个物品有两个权值 。求一组 ,最大化 的值。

作为第 个物品的权值,贪心地选所有权值大于 的物品即可得到最大值。

为了方便初学者理解,这里放上完整代码:


为了节省篇幅,下面的代码只保留 check 部分。主程序和本题是类似的。

POJ2976 Dropping tests

个物品,每个物品有两个权值

你可以选 个物品 ,使得 最大。

输出答案乘 后四舍五入到整数的值。

把第 个物品的权值设为 ,然后选最大的 个即可得到最大值。

洛谷 4377 Talent Show

个物品,每个物品有两个权值

你需要确定一组 ,使得 最大。

要求

本题多了分母至少为 的限制,因此无法再使用上一题的贪心算法。

可以考虑 01 背包。把 作为第 个物品的重量, 作为第 个物品的价值,然后问题就转化为背包了。

那么 就是最大值。

一个要注意的地方: 可能超过 ,此时直接视为 即可。(想一想,为什么?)

POJ2728 Desert King

每条边有两个权值 ,求一棵生成树 使得 最小。

作为每条边的权值,那么最小生成树就是最小值,

代码就是求最小生成树,我就不放代码了。

[HNOI2009]最小圈

每条边的边权为 ,求一个环 使得 最小。

作为边权,那么权值最小的环就是最小值。

因为我们只需要判最小值是否小于 ,所以只需要判断图中是否存在负环即可。

另外本题存在一种复杂度 的算法,如果有兴趣可以阅读 这篇文章

总结

分数规划问题是一类既套路又灵活的题目,一般使用二分解决。

分数规划问题的主要难点在于推出式子后想办法求出 的最大值/最小值,而这个需要具体情况具体分析。

习题

贡献者:@Ir1dXD@Flex@huaruoji@mgt@H-J-Granger@Henry-ZHR@Shuhao@Douglas@ouuan@Xeonacid

本页面最近更新:2/3/2023, 12:00:00 AM更新历史

发现错误?想一起完善? 在 GitHub 上编辑此页!

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论

0 条评论
未登录用户


Copyright © 2016 - 2023 OI Wiki Team

最近更新:fd2ec2c, 2023-02-03

联系方式:Telegram 群组 / QQ 群组