贪心水题 ~ 。
按性价比从大到小排序即可。
const int N=1010;
PDD a[N];
int n,m;
bool cmp(PDD &a, PDD &b)
{
return a.fi/a.se > b.fi/b.se;
}
int main()
{
while(cin>>m>>n)
{
if(n == -1 && m == -1) break;
for(int i=0;i<n;i++)
cin>>a[i].fi>>a[i].se;
sort(a,a+n,cmp);
int sum=0;
double res=0;
for(int i=0;i<n;i++)
{
if(sum + a[i].se > m)
{
res+=(m-sum)*a[i].fi/a[i].se;
break;
}
else
{
sum+=a[i].se;
res+=a[i].fi;
}
}
printf("%.3f
",res);
}
//system("pause");
return 0;
}