题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009
方法:贪心
思路:如果想要获得最大的收获,最好的办法就是每次都用最少的钱换到最多的东西,也就是说我们应该最先选择性价比最高的物品,这样思路就很清晰了,我们按照性价比对物品排序,然后开始取物品就可以了。
难点:数据类型的转换问题,其实也可以将所有数据统一成double,一劳永逸。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1010;
struct good
{
double num;
double money;
double p;
}cargo[N];
bool cmp(good a,good b)
{
if(a.p!=b.p)
return a.p>b.p;
}
int main()
{
double m;
int i,n;
double ans;
while(~scanf("%lf%d",&m,&n))
{
if(m == -1&&n == -1) break;
ans = 0.0;
for(i = 0;i < n;i++)
{
scanf("%lf%lf",&cargo[i].num,&cargo[i].money);
cargo[i].p = double(cargo[i].num/cargo[i].money);
}
sort(cargo,cargo+n,cmp);
for(i = 0;i < n;i++)
{
if(m>=cargo[i].money)
{
m -= cargo[i].money;
ans += cargo[i].num;
}
else
{
ans += m*cargo[i].p;
m = 0;
}
}
printf("%.3lf\n",ans);
}
}