杭电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 }

 

你可能感兴趣的:(杭电)