mltang

博客园 首页 新随笔 联系 订阅 管理

我参照了这个:https://blog.csdn.net/hzoi_ztx/article/details/54898323

 

这类问题通常有n个物品,一每个物品通常有一个value和wight(具体情况具体分析),问你从中选k个物品,他们的平均值最大是多少

首先,我们确定一个事情就是你不能拿前k个 value/wight 最大的物品当答案,

原因: 从中挑选k个物品,答案是  ans = ∑(v[i]) / ∑(w[i])   对吧,当然公式不是很严谨,意思就是挑k个使平均值最大

变形一下   ∑(v[i]) - ans*∑(w[i]) = 0;

令 f(x) = ∑(v[i]) - x*∑(w[i]) ;

当f(x) == 0 时的  x 就是在当前所选的k个物品中,平均值最大的答案(当前所选,不一定是最佳答案,可能还有更好的方案能使 x 再增大)

假设我们已经挑选了一个集合{a1,a2,a3,.....,ak} 称作方案a,作为我们选出来的k个物品,

同理另外一个集合{b1,b2,b3,....,bk} 乘坐方案b

你把他们带进公式里面,作图

临时找的一个绘图工具,不过也能说明白了,假设b是-x+7那条线,a是-0.5x+3那条,这个图告诉我们,斜率最小的函数,f(x) == 0 时的 x 她不一定是最优解

他还和斜率有关

ans = ∑(v[i]) / ∑(w[i])  ,假设我们选k个v[i]/w[i](斜率)最小的物品,一定能选出来斜率最小的组合(这个可以自己证明,我当时证明过于是我就做错了),但不一定是最优的结果,

解决这类问题的我所知道的两种方式:

一、枚举每一种情况,暴力算法能不对嘛,不过我觉得你可能有点苦,

二、猜 ans ,对ans进行二分的猜测,每次可以带入,一直猜到误差不大为止

 

posted on 2018-10-29 20:55  mltang  阅读(437)  评论(0编辑  收藏  举报