01分数规划学习笔记

定义

01分数规划是指这样一类问题:

给定一些物品,价值 \(a[i]\) ,花费 \(b[i]\) ,选取其中 \(k\) 个,使得 \(R=\frac{\sum{a[i]*x[i]}}{\sum{b[i]*x[i]}}\) 最大。(\(x[i]\) 为0或1,表示该物品取不取)

分析

我们定义一个函数 \(f(t)=\sum{a[i]*x[i]}-t*\sum{b[i]*x[i]}\) ,对式子做一个简单的变形, \(f(t)=\sum{((a[i]-t*b[i])*x[i])}\)

这时,如果 \(t\) 已知,则 \(a[i]-t*b[i]\) 就是已知的,但 \(x[i]\) 是未知的。于是我们记 \(d[i]=a[i]-t*b[i]\) ,函数变为 \(f(t)=\sum(d[i]*x[i])\)

仔细发现,函数中的 \(t\) 就是 \(ans\) ,而我们需要使 \(ans\) 最大,就必须使 \(t\) 最大。如果一个方案使 \(f(t)>0\) ,那么一定有比 \(t\) 更好的方案,我们就可以用这个方案。

综上,我们可以发现 \(d\) 数组是随 \(t\) 的增大而单调递减的,也就是说,存在一个临界 \(t\) 值使得不存在一种方案使 \(f(t)>0\) ,容易知道,这个 \(t\) 值就是最优解,而更大的 \(t\) 值会使 \(f(t)<0\) ,这是没有意义的。

所以我们可以二分 \(t\) 值,验证是否存在一组解使得 \(f(t)>0\) ,有就移到上界,没有就移到下界。

直到我们找到了一个最优解 \(t\) 值,此时 \(t=ans\)

例题

参考

Blog

posted @ 2020-02-04 18:57  小蒟蒻hlw  阅读(113)  评论(0)    收藏  举报