首页 > 其他分享 >1分数规划

1分数规划

时间:2022-11-10 18:22:19浏览次数:28  
标签:分数 ix ge0 na sum 二分 规划 nb

0x00 背景

求 :

\(max\tfrac{\sum_{i=1}^na_ix_i}{\sum_{i=1}^nb_ix_i}(x_i=0/1)\)

我们称此类问题为 “0/1分数规划”

Plan A

爆搜 , 时间复杂度 \(2^n\) , 寄

Plan B

二分法

0x01 二分法和0/1分数规划

part 1 怎么想到的 ?

我们先构造一个式子 : \(\sum_{i=1}^n(a_i-L*b_i)*x_i\ge0\)

我们不妨随便猜测一个值 \(L\) , 考虑是否存在一组解 \(\{x_1,x_2,...,x_n\}\) 满足上式

  1. 若存在一组解 , 那么变形得 \((\sum_{i=1}^na_ix_i)-L*(\sum_{i=1}^nb_ix_i)\ge0\) , 进一步地 :

\(存在\{x_1,x_2,...,x_n\}使得\tfrac{\sum_{i=1}^na_ix_i}{\sum_{i=1}^nb_ix_i}\ge L\)

也就是说 , \(L\)比我们要求的最大值小

  1. 若不存在 , 那么 :

\(对于所有\{x_1,x_2,...,x_n\} , \tfrac{\sum_{i=1}^na_ix_i}{\sum_{i=1}^nb_ix_i}< L\)

也就是说 , \(L\)比我们要求的最大值小

显然 , 我们求答案的过程是满足单调性的 , 满足使用二分进行求解的要求 , 因此是可以考虑使用二分求解的

part 2 怎么做的?

我们二分 \(L\) 的时候如何进行 \(check\) 呢 ?

上面最容易验证的就是\(\sum_{i=1}^n(a_i-L*b_i)*x_i\ge0\) 了 , 验证的方法非常简单 , 只需要从那些\((a_i-L*b_i)\) 能中选出正数即可

二分结束 , \(L\)即为我们需要的解

标签:分数,ix,ge0,na,sum,二分,规划,nb
From: https://www.cnblogs.com/sheepcsy/p/16877988.html

相关文章