分数规划学习笔记
分数规划是一种用来求分式极值的算法。
题意可以形式化的看作,给定 \(a_i\) 和 \(b_i\),要求找到一组 \(w_i \in \left \{ 0,1 \right \}\),使得 \(\frac{\sum_{i=1}^{n}a_i*w_i}{\sum_{i=1}^{n}b_i*w_i}\) 最大或最小
解决办法主要有两个,二分以及 Dinkelbach 算法,个人感觉二分法可以解决绝大部分分数规划问题了,所以没有系统学习后一种,如果有时间在补上。
二分法
现在来说二分法,假设当前我们已经二分出了一个答案 \(mid\),现在要判断 \(mid\) 是否可行。
\[\begin{align}
&\frac{\sum_{}^{}a_i*w_i}{\sum_{}^{}b_i*w_i}>mid\\
\Longrightarrow &\sum_{}^{}a_i*w_i-mid*\sum_{}^{}b_i*w_i>0\\
\Longrightarrow &\sum_{}^{}w_i*(a_i-mid*b_i)
\end{align}
\]
那么我们的任务就是判断左式最大值是否大于 0。
所以围绕分数规划出的题目,根本的区别就是这个最大值求法,下面结合例题理解。
例题
-
[JSOI2016] 最佳团体
首先看出这是一道分数规划问题,那么直接将权值转化为 \(p_i-mid*s_i\),然后开始考虑如何求最大值,这个题目还是很容易看出是个树上背包的板子题,所以正解就是二分加树上背包。 -
[USACO18OPEN] Talent Show G
同样的,转化完权值,然后用01背包解决即可。 -
[SDOI2017] 新生舞会
分数规划加费用流 -
[USACO01OPEN] Earthquake
分数规划加最大生成树
这么一写突然发现也没什么好理解的,总之你在发现这是一道分数规划,二分并转移权值后,这题就和分数规划没关系了。

浙公网安备 33010602011771号