01分数规划算法 信息学竞赛 OI ACM 二分 Dinkelbach 最优比率生成树 最优比率环
01分数规划
张天翔
blog.csdn.net/hzoi_ztx
ztx97@qq.com
前置技能
- 二分思想
- 最短路算法
- 一些数学脑细胞?
问题模型1
基本01分数规划问题
给定 n n n个二元组 ( v a l u e i , c o s t i ) (value_i,cost_i) (valuei,costi), v a l u e i value_i valuei是选择此二元组获得的价值(非负), c o s t i cost_i costi是选择此二元组付出的代价(非负),设 x i ( x i ∈ { 0 , 1 } ) x_i(x_i\in \{0,1\}) xi(xi∈{
0,1})代表第 i i i个二元组的选与不选,最大(小)化下式
m a x i m i z e ( o r m i n i m i z e ) r = ∑ v a l u e i ⋅ x i ∑ c o s t i ⋅ x i maximize(or\ minimize)\ \ \ r = \frac{\sum value_i \cdot x_i}{\sum cost_i\cdot x_i} maximize(or minimize) r=∑costi⋅xi∑valuei⋅xi
下面先说最大化
解决方法
二分法
设 r r r最大值为 r ∗ r^* r∗,
r ∗ = ∑ v a l u e i ⋅ x i ∑ c o s t i ⋅ x i r^* = \frac{\sum value_i \cdot x_i}{\sum cost_i\cdot x_i} r∗=∑costi⋅xi∑valuei⋅xi
∑ v a l u e i ⋅ x i − r ∗ ⋅ ∑ c o s t i ⋅ x i = 0 \sum value_i \cdot x_i - r^*\cdot \sum cost_i\cdot x_i = 0 ∑valuei⋅xi−r∗⋅∑costi⋅xi=0
设一个函数,自变量为 r r r值,
f ( r ) = ∑ v a l u e i ⋅ x i − r ∗ ⋅ ∑ c o s t i ⋅ x i f(r) =\sum value_i \cdot x_i - r^*\cdot \sum cost_i\cdot x_i f(r)=∑valuei⋅xi−r∗⋅∑costi⋅xi
观察这个函数,假如 { x i } \{x_i\} { xi}固定,则这个函数就是坐标系中一条直线( y = B − A ⋅ x y = B - A\cdot x y=B−A⋅x),每一组 { x i } \{x_i\} { x