01分数规划问题

#问题模型1: 给定$n$个二元组$(value_i,cost_i)$,在其中选出$m$个,$value_i$是选择此二元组获得的价值(非负),$cost_i$是选择此二元组付出的代价(非负),设$xi(xi\in{0,1})$代表第$i$个二元组的选与不选,最大化下式 $r=\frac{\Sigma value_i*Xi}{\Sigma cost_i*Xi}$ $1<=n<=1000,0<=k\(\Sigma value_i*x_i-\Sigma cost_i*x_i*r=0\),设\(f(r)=\Sigma value_i*x_i-\Sigma cost_i*x_i*r\)

那么答案一定是这个函数和\(X\)轴的交点,因为{\(Xi\)}不同,所以这个函数的斜率和截距也就不同,因为\(\Sigma value_i*x_i\)\(\Sigma cost_i*x_i\)非负的原则,那么我们的图像是这样的。

让答案的\(r\)最大,我们就应该让与\(X\)轴交点最大

将以上式子化简为\(\Sigma x_i(value_i-cost_i*r)\)

我们二分一条平行于\(X\)轴的直线\(x=a\),如果\(f(a)>0\) 说明还可以将直线右移,如果\(f(a)<0\)那么说明与\(X\)轴交点应该在左边,如果等于就说明这里就是\(r\)的最大值。

\(f(a)\)怎么求呢?我们可以用贪心的思想,设\(v_i=value_i-cost_i*r\),然后取\(v_i\)\(m\)大即可,这样确保\(f(a)\)的值尽量大,\(x=a\)尽量往右移,最终知道\(\Sigma v_i=0\),这样就能确保答案的\(r\)最大了。

\(Code\)

还没写就先这样吧

posted @ 2019-07-31 19:01  __Liuz  阅读(239)  评论(0编辑  收藏  举报