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\n", ans);
    return 0;
}



猜你喜欢

转载自www.cnblogs.com/v-vip/p/9573264.html
今日推荐