贪心练习——肥鼠的交易

来源:互联网 发布:网络类型设置方法 编辑:程序博客网 时间:2024/06/09 17:19

题目描述:这是属于部分背包问题,一老鼠有M斤猫粮,要拿去和猫交换鼠粮,不同的猫咪兑换标准不一样,求老鼠用自己的猫粮如何能尽可能的换到更多鼠粮?输入数据包括多组样例,第一行是两个整数,M和N,M代表鼠拥有的猫粮有多少斤,N表示有N只猫同意交换。若N==M==-1,结束输入。接下来输入N组数据,每组数据包括两个整数,j和f 。代表猫愿意用f斤猫粮换j斤鼠粮。结果保留小数点三位。

测试样例:

输入:

5 3

7 2

4 3

5 2

20 3

25 18

24 15

15 10

-1 -1

输出:

13.333

31.500

代码实现:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int j[9999],f[9999];
    double ave[9999];
    int i,m,n,k,tem;
    double leftm,sum,largeave;
    while(1){
             scanf("%d %d",&m,&n);
             if(m==-1&&n==-1) break;
             sum=0;
             leftm=m;
             for(i=0;i<n;i++){
             scanf("%d %d",&j[i],&f[i]);
             ave[i]=(double)j[i]/(double)f[i];
             }
             while(leftm!=0){
               largeave=ave[0];
               for(k=0;k<n;k++){   
               if(ave[k]>=largeave&&ave[k]>0){
                  largeave=ave[k];
                  tem=k;
                  }
                  }
               if(leftm>=f[tem]){
                  sum=sum+j[tem];
                  leftm=leftm-f[tem];
                  ave[tem]=0;
                  }
               else if(leftm<f[tem]){
                    sum=sum+leftm*ave[tem];
                    leftm=0;
                    }
                  
              }
              printf("%.3lf\n",sum);
             }
   system("pause"); 
}

0 0
原创粉丝点击