• HUSTOJ 1072 小数背包问题


          HUSTOJ 1072 小数背包问题

    题目描述

    有一个背包,背包容量是M(0<M500),有N(1<N1000)个物品,物品可以分割成任意大小。

      要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

    输入

    第1行有两个数,M和N;
    第2行到N+I行:第i行为第i-1个物品的价值和质量(均为小于100的正整数),中间用空格隔开。

    输出

    只有一个数为最大总价值(保留一位小数)。

    样例输入

    150 7
    10 35
    40 30
    30 60
    50 50
    35 40
    40 10
    30 25
    

    样例输出

    190.6

    思路:贪心,因为物品可以分成任意大小,所以要按照性价比来排序
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int n;
    double m, ans;
    struct nond {
        int val, m;
        double tmp;
    }e[1005];
    
    bool cmp(nond x, nond y) {
        return x.tmp > y.tmp;
    }
    
    int main() {
        scanf("%lf%d", &m, &n);
        for(int i = 1; i <= n; i++) {
            scanf("%d%d", &e[i].val, &e[i].m);
            e[i].tmp = 1.0 * e[i].val / e[i].m;
        }
        sort(e + 1, e + n + 1, cmp);
        int i = 1;
        while(m > 0) {
            if(e[i].m <= m) {
                m -= e[i].m;
                ans += e[i].val;
            }
            else {
                ans += m * e[i].tmp;
                break;
            }
            i++;
        }
        printf("%.1lf
    ", ans);
        return 0;
    }



  • 相关阅读:
    codevs1076 排序
    codevs1075 明明的随机数
    codevs1205 单词翻转
    codevs1204 寻找子串位置
    codevs2235 机票打折
    codevs1206 保留两位小数
    codevs1203 判断浮点数是否相等
    codevs1202 求和
    codevs1201 最小数和最大数
    Static Sushi AtCoder
  • 原文地址:https://www.cnblogs.com/v-vip/p/9573264.html
Copyright © 2020-2023  润新知