题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009

题意:老鼠有M磅猫粮,它要去跟猫做交易,拿它的猫粮换鼠粮,现有n个房间,第i个房间都有J[i]磅的鼠粮,同时需要支付F[i]磅猫粮,但是老鼠可以不用把鼠粮全部换走,即它可以用x磅的猫粮换取x*(J[i] / F[i])的鼠粮,问M磅猫粮最多可以获取鼠粮的重量。

思路:贪心算法,求最优解。将J[i]/F[i]的值从大到小排列,总是先取最大的,就能保证能够得出的是最大值

My  DaiMa:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct person
{
	double a,b,pi;
}s[1003];
bool cmp1(person p1, person p2)
{
	return p1.pi > p2.pi;
}
int main()
{
	int n, m;
	while (cin >> m >> n)
	{
		if (m == -1 || n == -1)
			break;
		else
		{
			for (int i = 0; i < n; i++)
			{
				cin >> s[i].a >> s[i].b;
				s[i].pi = s[i].a / s[i].b;
			}
			sort(s, s + n, cmp1);//根据兑换率对结构体进行排序
			double ans = 0;
			for (int i = 0; i < n; i++)
			{
				if (m >= s[i].b)
				{
					m -= s[i].b;
					ans += s[i].a;//表示它的猫粮够换取这个房间里的所有鼠粮
				}
				else
				{
					ans += s[i].pi*m;//用它剩下的猫粮乘以兑换率
					break;
				}
			}
			printf("%.3lf\n", ans);
		}
	}
}