zoukankan      html  css  js  c++  java
  • 最大化平均值

    我参照了这个: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进行二分的猜测,每次可以带入,一直猜到误差不大为止

     

  • 相关阅读:
    Ajax返回xml类型数据
    选择排序 C&&C++
    php 给app写短信验证码 使用memcache缓存验证码
    php 免费的快递查询接口快递100
    CSS字体大小设置时的参考(转)
    excel vba 打印设置(转)
    MySQL的数据类型(转)
    XMind 8 pro update 7激活办法
    张小龙2011年饭否日记
    页面静态化技术Freemarker技术的介绍及使用实例.
  • 原文地址:https://www.cnblogs.com/mltang/p/9872021.html
Copyright © 2011-2022 走看看