贪心算法:Hdu1009
题目大意:
老鼠准备了m磅的猫粮准备和守鼠粮的猫交换
猫守着n个仓库,其中存放着不同数量的鼠粮,不同的仓库交换其中的鼠粮所需要的猫粮是不一样的,所以每个仓库有两个数据 1 鼠粮的重量 2 换取这些鼠粮所需要的猫粮。
例如 第一个仓库 18 4 就表明老鼠用4磅的猫粮可换取18磅的鼠粮。但是如果老鼠没有4磅的猫粮,那它能支付所需猫粮的几分之几就可以得到相应鼠粮的几分之几,例如现在老鼠只有2磅猫粮,那么他能换的到第一个仓库中的9磅鼠粮。
现在有n个这样不同的仓库,老鼠要你帮它计算用它所有的猫粮可以换到最大数量的鼠粮是多少?
分析思路:
先用两个数组存放仓库中鼠粮的重量,和所需的猫粮。a[i] b[i];
再用一个数组c[i]来存放每个仓库对应的单位猫粮可以换多少鼠粮。
再以c[i]为标准对 a[i] b[i]c[i]进行排序,得到一个递减序列
然后性价比最高的仓库就在最前面,依次递减。
逐个换取,直到所有的猫粮换完为止,所换得到的鼠粮即所能换到的最多的鼠粮。
代码:
#include<stdio.h>
#include<stdlib.h>
/*double a[100000000]; 使用固定的数组会 run time error
double b[100000000];
double c[100000000];*/
int main ()
{
double *a,*b,*c;
int i,j,n;
double m,t,sum=0;
while(~scanf("%lf%d",&m,&n)){
if (m==-1&&n==-1) break;
a=(double *)malloc(sizeof(double)*n);
b=(double *)malloc(sizeof(double)*n); //改成动态申请的数组才可以通过.
c=(double *)malloc(sizeof(double)*n);
for(i=0;i<n;i++){
scanf("%lf%lf",&a[i],&b[i]);
c[i]=a[i]/b[i];
}
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(c[j]<c[j+1]){
t=c[j];
c[j]=c[j+1];
c[j+1]=t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
for(i=0;i<n;i++){
if(m>=b[i]){
sum+=a[i];
m-=b[i];
}
else{
sum+=m*c[i];
break;
}
}
printf("%.3lf\n",sum);
sum=0;
}
return 0;
}