2052装船问题(贪心)

Description

王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有wi吨,总价值是pi。王小二的任务是从10种货物中挑选若干吨上船,在满足货物总重量小于等于M的前提下,运走的货物的价重比最大。

Input

输入数据的第一行有一个正整数M(0 < M < 10000),表示所有货物最大载重量。在接下来的10行中,每行有若干个数(中间用空格分开),第i行表示的是第i种货物的货物的总价值pi ,总重量wi。(pi是wi的整数倍,0 < pi , wi < 1000)

Output

输出一个整数,表示可以得到的最大价值。

Sample

Input 

100
10 10
20 10
30 10
40 10
50 10
60 10
70 10
80 10
90 10
100 10

Output 

550

Hint

价重比:计算其价值与重量之比

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <vector>
 5 #include <queue>
 6 
 7 #define inf 0x3f3f3f3f
 8 
 9 using namespace std;
10 
11 struct node
12 {
13     int pi, wi, data;
14 }huo[15];
15 
16 bool cmp(struct node a, struct node b)
17 {
18     return a.data > b.data ||(a.data==b.data&&a.wi>b.wi);
19 }
20 
21 int main()
22 {
23     int n, m, i;
24     long long re;
25     cin >> m;
26     n = 10;
27     for(i=0;i<n;i++)
28     {
29         cin >> huo[i].pi >> huo[i].wi;
30         huo[i].data = huo[i].pi / huo[i].wi;
31     }
32     sort(huo, huo+n, cmp);
33     re = 0;
34     for(i=0;i<n;i++)
35     {
36         if(m < huo[i].wi)
37         {
38             re = re + m * huo[i].data;
39             break;
40         }
41         else
42         {
43             m -= huo[i].wi;
44             re += huo[i].pi;
45         }
46     }
47     cout << re << endl;
48 
49     return 0;
50 }
原文地址:https://www.cnblogs.com/0xiaoyu/p/14092651.html