杭电oj 1009 FatMouse' Trade

 

Tips:本题采用贪心算法,类似于背包问题,关键在于读入数据之后,将数据按 J[i]/F[i] 从大到小排列即可。

 1 /**本程序主要采用贪心算法思想,类似于背包问题*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 int main()
 5 {
 6     int M,N;
 7     while(scanf("%d %d",&M,&N))
 8     {
 9         if(M == -1 && N == -1)
10         {
11             return 0;
12         }
13         double J[1000]={0},F[1000]={0};
14         double sum = 0.0;
15         int i,j,t;
16         //将j[i]和f[i]读取出来
17         for(i = 0;i < N;i++)
18         {
19             scanf("%lf %lf",&J[i],&F[i]);
20         }
21         //按照J[i]/F[i]非递增排序
22         for(i = 0;i < N-1;i++){
23               for(j = i;j < N-1;j++){
24                   if((J[i]/F[i])<(J[j+1]/F[j+1])){
25                      t=J[i],J[i]=J[j+1],J[j+1]=t;
26                      t=F[i],F[i]=F[j+1],F[j+1]=t;
27                   }
28               }
29           }
30         //采用贪心进行计算
31         for(i = 0;i<N;i++)
32         {
33             if(M==0)
34             {
35                 break;
36             }
37             if(M != 0 && F[i] <= M)
38             {
39                 sum += J[i];
40                 M -= F[i];
41             }else if(M !=0 && F[i]>M)
42             {
43                 sum += J[i]*M/F[i];
44                 M -= M;
45             }
46         }
47         //输出结果
48         printf("%0.3f\n",sum);
49 
50     }
51     return 0;
52 }

 

posted @ 2015-06-07 22:39  CSUER  阅读(555)  评论(0编辑  收藏  举报