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 ",sum); 49 50 } 51 return 0; 52 }