浅谈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的大小与上下的总值有关。
二、贪心算法
我们反观一下贪心算法,先算出每个