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<n,0<=ai<=bi<=1e9\)

\(Solution\)

这道题用\(DP\)什么的明显是不行的,虽然我也没试过
将上式化简为

\(\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\)

还没写就先这样吧

猜你喜欢

转载自www.cnblogs.com/Liuz8848/p/11266105.html