51nod 1257 背包问题 V3


二分法
分数规划
基准时间限制:3 秒 空间限制:131072 KB 分值: 80  难度:5级算法题
 收藏
 关注
N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大。
Input
第1行:包括2个数N, K(1 <= K <= N <= 50000)
第2 - N + 1行:每行2个数Wi, Pi(1 <= Wi, Pi <= 50000)
Output
输出单位体积的价值(用约分后的分数表示)。
Input示例
3 2
2 2
5 3
2 1
Output示例
3/4




https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257



这个题之前一直想不通,最后是发现缺乏分数规划的知识。。知道了分数规划,,就知道 ,,这个题二分秒过 = =、。

关于分数规划

摘自 http://blog.csdn.net/orpinex/article/details/6973778

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

要求f(x)/g(x)的最值,其中f(x),g(x)都是线性函数,而其中被研究的最多的是0-1分数规划,即求这样的一个式子的极值

r=(∑(ci*xi))/(∑(di*xi)),其中xi∈{0,1}

我们可以把这个式子变换一下

z=(∑(ci*xi))-r'*(∑(di*xi)),其中z是左边这个式子的最大(小)值

由于di为正数,xi为非负数,所以

r'>r 时 z(r')<0

r'=r 时 z(r')=0

r'<r 时 z(r')>0

易证z函数严格单调递减,那么我们可以二分r',直到z(r')=0,此时r'=r,问题得解

PS:z函数也是凸函数


除了二分,还有一种算法叫Dinkelbach算法

每次将r'代入z函数中计算以后,我们将得到一组x

让r''=(∑(ci*xi))/(∑(di*xi))

当r''=r'时,r''就是我们需要的解

否则将r'=r'',继续迭代

这种方法比二分法要快一点




等于利用分数规划。。二分答案,然后判断答案是否成立 - -





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值