P2240 部分背包问题

题目链接:P2240

解题思路:

计算出每堆金币的单位价值(总价值除以总质量),然后每次尽可能取单位价值最大的。

AC代码:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int n,t;
 6 double sum;
 7 struct node
 8 {
 9     int m,v;
10     double w;
11     bool operator < (const node &b) const
12     {
13         return w > b.w;
14     }
15 } a[110];
16 int main()
17 {
18     sum = 0;
19     cin >> n >> t;
20     for(int i = 0; i < n; i++)
21     {
22         cin >> a[i].m >> a[i].v;
23         a[i].w = a[i].v*1.0/a[i].m;
24     }
25     sort(a,a+n);
26     for(int i = 0; i < n; i++)
27     {
28         if(t == 0) break;
29         if(a[i].m <= t) // 如果能全拿,就全拿
30         {
31             t -= a[i].m;
32             sum += a[i].w*a[i].m;
33         } else if(a[i].m > t) { // 全拿不了,能拿多少拿多少
34             sum += a[i].w*t;
35             t = 0;
36         }
37     }
38     printf("%.2f",sum);
39     return 0;
40 }

 

posted @ 2020-09-12 23:06  不敢说的梦  阅读(158)  评论(0)    收藏  举报