贪心,求性价比排序一个个去换就好了,WA了一次,没有考虑猫粮过剩的情况
#include<stdio.h>
int main()
{
int n;
double m;
while (1)
{
int j[1001],f[1001],y[1001],t,i,r,c=0;
double k[1001],sum=0;
scanf("%lf%d",&m,&n);
if (m==-1.0&&n==-1) break;
for (i=0;i<=n-1;i++) {scanf("%d%d",&j[i],&f[i]);k[i]=j[i]*1.0/f[i]*1.0;y[i]=i;}
for (i=0;i<=n-2;i++)
for (r=i+1;r<=n-1;r++)
if (k[y[i]]<k[y[r]]) {t=y[i];y[i]=y[r];y[r]=t;}
while (m>0&&c<n)//就是这个c<n第一次没写
{
if (m>=f[y[c]]*1.0) {m-=f[y[c]]*1.0;sum+=j[y[c]];c++;}
else {sum+=k[y[c]]*m;m=0;}
}
printf("%.3lf\n",sum);
}
}