01分数规划学习

真的是很差啊,这个东西弄了好久也没看懂。主要是数学比较差的原因吧。

网上把一些不等式啊啥的略了,我就mengbi了。


最普通的01分数规划是这样一个基本问题http://poj.org/problem?id=2976。就像这样吧。

每个物品有一个价值${a}_{i}$,花费${b}_{i}$。要求的是选其中$k$个,使得

  $R=sum frac{{a}_{i}*{x}_{i}}{{b}_{i}*{x}_{i}}$

最大。

这里的${x}_{i}$非0即1,表示是否选取该物品。

我们有一个函数$F(t)=sum ({a}_{i}*{x}_{i})-t imes sum ({b}_{i}*{x}_{i})$,假设我们能在可接受的复杂度内求出是否有一种${x}_{i}$的取值,能使得$F(t)geq 0$。

由$F(t)$的定义式及$F(t)geq 0$的条件,经过简单的移项可得$sum frac{{a}_{i}*{x}_{i}}{{b}_{i}*{x}_{i}}geq t$

又由$R$的定义式,上式左边不就是$R$吗?!所以只要存在$F(t)geq 0$,我们就能知道是存在一种${x}_{i}$的取值能让$R$大于等于$t$的。

显然在满足存在${x}_{i}$使得$F(t)geq 0$的条件下,$t$的取值越大,我们就越逼近$R$的最大值。当我们找不到一种${x}_{i}$的取值能让$F(t)geq 0$时,就说明$R$是不能大于等于$t$的。

所以得出:当我们找到这样一个$t$,它本身可行但再大一点就找不到${x}_{i}$取值集合能让$F(t)geq 0$,那么可以认为,$t$就是我们要求的$R$的最大值。显然这是可以二分解决的。

那么问题只剩下了,如何判定是否存在${x}_{i}$取值集合能让$F(t)geq 0$??

由$sum $的性质,我们求出每个物品的${a}_{i}-t*{b}_{i}$,想让$F(t)$尽量大且只能选$k$个,就选${a}_{i}-t*{b}_{i}$最大的前$k$个,自然就使得$F(t)$最大了!

问题至此就解决了。二分$t$,每次判定$F(t)$是否可能大于等于0,可以的话提高下界,否则降低上界。结果即所求。

原文地址:https://www.cnblogs.com/orzzz/p/7461871.html