
/**//*
input:
53
72
43
52
output
13.333
5个猫食,3个房间,第1个房间2个猫食换7个JavaBean,第2个房间3个猫食换4个JavaBean,第3个房间2个猫食换5个JavaBean;
最大量的JavaBean是7+5+(1/3)*4=13.333。
简单的贪心策略:每次以最小量的猫食换最大量的JavaBean,即每次取(J[i]/F[i])最大的J[i]将使换得的JavaBean量最大。
*/
#include<algorithm>
#include<iostream>
#include<vector>
usingnamespacestd;
structJavaBeanCaCatFood
...{
intJavaBean,CatFood;
};
boolcmp(JavaBeanCaCatFooda,JavaBeanCaCatFoodb)
...{
return(double)a.JavaBean/a.CatFood>(double)b.JavaBean/b.CatFood;
}

boolrun()...{
intn,m;
cin>>m>>n;
if(m==-1&&n==-1)returnfalse;
vector<JavaBeanCaCatFood>JavaBeanCaCatFood(n);
inti;
for(i=0;i<n;i++)cin>>JavaBeanCaCatFood[i].JavaBean>>JavaBeanCaCatFood[i].CatFood;
sort(JavaBeanCaCatFood.begin(),JavaBeanCaCatFood.end(),cmp);
doubles=0,t=0;
for(i=0;i<n;i++)
...{
if(m>=JavaBeanCaCatFood[i].CatFood)//i房间的能全换
...{
m-=JavaBeanCaCatFood[i].CatFood;
t+=JavaBeanCaCatFood[i].JavaBean;
}
else
...{
t+=JavaBeanCaCatFood[i].JavaBean*((double)m/JavaBeanCaCatFood[i].CatFood);//剩下不够全换
break;
}
}
printf("%.3lf ",t);
returntrue;
}

intmain()...{
while(run());
return0;
}
本文介绍了一个关于猫食与JavaBean交换的问题,并通过贪心算法来解决如何用有限数量的猫食换取最多数量JavaBean的问题。具体做法是先定义结构体存储每个房间的JavaBean与猫食数量,然后利用比较函数对这些房间按每单位猫食可换取的JavaBean数量进行排序,最后依次选择最优房间进行交换直到猫食用尽。
1028

被折叠的 条评论
为什么被折叠?



