#include <iostream>
#include <algorithm>
#include <iomanip> //c++保留几位小数所用库函数
#define MAX 1005
using namespace std;
/******************************************************************************************************************
大意:
老鼠准备了M磅猫食,准备拿这些猫食跟猫交换自己喜欢的食物。有N个房间,
每个房间里面都有食物。你可以得到J[i]但你需要付出F[i]的猫食。
要你计算你有M磅猫食可以获得最多食物的重量。
思路:
贪心算法,求最优解。
将J[i]/F[i]的值从大到小排列,总是先取最大的,就能保证能够得出的最大值。
******************************************************************************************************************/
struct Node
{
double j,f;
double vis;
}node[MAX];
bool cmp(Node x,Node y)
{
return x.vis>y.vis;
}
int main()
{
int M,N;
while(cin>>M>>N)
{
double num=0;
if(M == -1||N == -1) break;
for(int i=0;i<N;i++){
cin>>node[i].j>>node[i].f;
node[i].vis=node[i].j/node[i].f;
}
sort(node,node+N,cmp);
for(int i=0;i<N;i++){
if(M>0){
if(M>=node[i].f)
num+=node[i].j;
else
num+=node[i].j*(M/node[i].f);
M-=node[i].f;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(3)<< num <<endl; //仿照此格式保留3位小数
}
return 0;
}
转载于:https://www.cnblogs.com/Jstyle-continue/p/6352049.html