推荐博客 : http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html
学习这东西源于牛客多校大佬们的一道签到题....
先来看一个问题
01分数规划问题:所谓的01分数规划问题就是指这样的一类问题,给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价。如果选取i,定义x[i]=1否则x[i]=0。每一个物品只有选或者不选两种方案,求一个选择方案使得R=sigma(a[i]*x[i])/sigma(b[i]*x[i])取得最值,即所有选择物品的总收益/总代价的值最大或是最小。
问题分析 :
数学分析中一个很重要的方法就是分析目标式,这样我们来看目标式。
R=sigma(a[i]*x[i])/sigma(b[i]*x[i])
我们来分析一下他有什么性质可以给我们使用。
我们先定义一个函数F(L):=sigma(a[i]*x[i])-L*sigma(b[i]*x[i]),显然这只是对目标式的一个简单的变形。分离参数,得到F(L):=sigma((a[i]-L*b[i])*x[i])。这时我们就会发现,如果L已知的话,a[i]-L*b[i]就是已知的,当然x[i]是未知的。记d[i]=a[i]-L*b[i],那么F(L):=sigma(d[i]*x[i]),多么简洁的式子。我们就对这些东西下手了。
显然对于上面的式子,当 L 取最大值时, F(L) = 0 , 而当 L 的取值大于最大值时,此时F(L)的值是 < 0 的, 当L取小时, F(L) > 0 ,那么我们这里根据这个性质就可以去二分 L 了
然后再去选择物品,能少选就少选 !