8、算法:贪心算法

有m元钱,n中物品;每种物品有j磅,总价值f元,可以使用0到f的任意价格购买相应磅的物品,例如使用0.3f元,可以购买0.3j磅物品。要求输入用m元钱最多能买到多少物品。

#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;

struct goods{ // 表示可买物品的结构体
    double j; // 该物品总重
    double f; // 该物品总价值
    double s; // 该物品性价比
    bool operator < (const goods &A) const{ //重载小于运算符
      return s>A.s; // sort默认从小到大排序(正常return s<A.s),如果return s>A.s相当于从大到小排序
    }
}good[1000];

int main(){
  double m;
  int n;
  while(scanf("%lf%d", &m,&n) != EOF){
        if(m==-1 && n==-1) break; // 当m==-1 && n==-1时跳出循环,程序运行结束
        for (int i = 0; i < n; ++i) {
      scanf("%lf%lf", &good[i].j, &good[i].f);
      good[i].s = good[i].j / good[i].f;
    }

        // 第三个参数:less<int>从小到大;greater<int>从大到小;greater<char>
        // 快排,时间复杂度为n*log2(n)
        sort(good, good+n);

        int idx = 0;
        double ans = 0;

        while(m>0 && idx<n){
          if(m>good[idx].f){
            ans += good[idx].j;
            m -= good[idx].f;
          }else {
            ans += m*good[idx].s;
            m = 0;
      }
          idx++;
        }

//        printf("%.3lf\n", ans);
        cout << setiosflags(ios::fixed) << setprecision(3) << ans <<endl;
  }

  return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,268评论 3 52
  • 日子有那么多种过法,生活有那么多种滋味,何必这也要坚持,那也要做到? 不愿早起,好,妈妈陪着你一起赖床。喜欢你...
    yiyishenghui阅读 373评论 0 0
  • 01 当蜘蛛网无情地查封了我的炉台,当灰烬的余烟叹息着贫困的悲哀,当曾经的无话不谈,变成现在的无话可谈,朋友,你是...
    竹叶腾1阅读 460评论 2 4
  • 如果你跟你一个熟悉得不能再熟悉的朋友突然没有话聊,陷入了尴尬,会怎样? 2016年我们考上了大学,他在北京,我在湖...
    小俞秋阅读 195评论 0 1