也可以看做可拆分的背包问题
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
bool cmp(pair<double,double>a,pair<double,double>b)
{return a.first/a.second>b.first/b.second;}
int main()
{int i,j,k,n;double m;
pair<double,double>c[1005];
while(cin>>m>>n&&(m!=-1||n!=-1))
{for(i=0;i<n;i++)
cin>>c[i].first>>c[i].second;
sort(c,c+n,cmp);
j=0;double ans=0;
while(j<n)
{
if(m-c[j].second>=0)
{m-=c[j].second;ans+=c[j].first;}
else if(m>0&&m-c[j].second<0)
{ans+=m*c[j].first/c[j].second;m=0;}
j++;
}
cout<<setiosflags(ios::fixed)<<setprecision(3)<<ans<<endl;
}
}