4110:圣诞老人的礼物-Santa Clau’s Gifts(贪心算法)

 

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿最多只能承受一定重量的糖果,请问圣诞老人最多能带走多大价值的糖果。

输入
第一行由两个部分组成,分别为糖果箱数正整数n(1 <= n <= 100),驯鹿能承受的最大重量正整数w(0 < w < 10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。
输出
输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。
样例输入
4 15
100 4
412 8
266 7
591 2
样例输出
1193.0

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct T {
 4     int v,w;
 5     double p;
 6 };
 7 bool cmp(T a,T b) {
 8     return a.p>b.p;
 9 }
10 
11 int main() {
12     int n,m;
13     double ans=0;
14     cin>>n>>m;
15     T t[n];
16     for(int i=0; i<n; i++) {
17         cin>>t[i].v>>t[i].w;
18         t[i].p=t[i].v/t[i].w;
19     }
20     sort(t,t+n,cmp);
21     int i=0;
22     while(m>0) {
23         if(m-t[i].w>0) {
24             ans+=t[i].v;
25             m-=t[i].w;
26             i++;
27         }
28         else{
29             ans+=t[i].p*m;
30             m=0; 
31         }
32     }
33     printf("%.1lf\n",ans);
34     return 0;
35 }

猜你喜欢

转载自www.cnblogs.com/aiqinger/p/12584306.html