浅谈01分数规划-代码改变世界

浅谈01分数规划所谓01分数规划,看到这个名字,可能会想到01背包,其实长得差不多。 这个算法就是要求“性价比”最高的解。sum(v)/sum(w)最高的解。定义我们给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价。如果选取i,定义x[i]=1否则x[i]=0。每个物品只有选和不选的两种方案,求一个选择的方案使得R=sigma(a[i]*x[i])/sigma(b...
摘要由CSDN通过智能技术生成

浅谈01分数规划

所谓01分数规划,看到这个名字,可能会想到01背包,其实长得差不多。
这个算法就是要求“性价比”最高的解。sum(v)/sum(w)最高的解。


定义

我们给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价。如果选取i,定义x[i]=1否则x[i]=0。每个物品只有选和不选的两种方案,求一个选择的方案使得R=sigma(a[i]*x[i])/sigma(b[i]*x[i]),也就是选择物品的总收益/总代价最大或者最小。

01分数规划问题主要包含以下几个问题:

  • 一般的01分数规划
  • 最优比率生成树
  • 最优比率环

关于01分数规划的关键

F(L)=sigma(a[i]*x[i])-L*sigma(b[i]*x[i])
F(L)=sigma(a[i]*x[i]-L*b[i]*a[i])
F(L)=sigma((a[i]-L*b[i])*x[i])

我们把a[i]-L*b[i]定义为d[i],这样我们的算式就变成了以下算式。

F(L)=sigma(d[i]*x[i])

这样我们就把这个繁琐的算式变成了一个非常优美的算式。
而01分数规划就是要枚举L在求最大值或最小值的F(L)。
在实现程序的过程中,我们使用一个非常熟悉的老朋友,要求最大或最小,所以??我们就要用二分


关于为什么01分数规划不能用贪心?

(个人看法)
如果硬要贪心,那么就只有可能是算出每一个物品的性价比,在排序求出最大或者最小的性价比,在累加算出答案。

一、01分数规划算法

先设置价值数组a[i]和代价数组b[i],我们的答案为R。

R=ni=1a[i]x[i]ni=1b[i]x[i] R = ∑ i = 1 n a [ i ] ∗ x [ i ] ∑ i = 1 n b [ i ] ∗ x [ i ]

简单来说
R=valueiweighti R = ∑ v a l u e i ∑ w e i g h t i

我们可以发现,R的大小与上下的总值有关。

二、贪心算法

我们反观一下贪心算法,先算出每个

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值