#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; }