01完全背包问题;直接排序遍历到n==0即可;
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int p,n;
}A;
int cmp(const void *p1,const void *p2)
{
A *q1=(A *)p1;
A *q2=(A *)p2;
return q1->p-q2->p;
}
int main ()
{
A a[1002];
int t,n,m,i;
double s;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
scanf("%d%d",&a[i].p,&a[i].n);
qsort(a,m,sizeof(a[0]),cmp);
for(i=0,s=0;i<m;i++)
{
if(n==0)
return 0;
if(n>=a[i].p*a[i].n)
{
s+=a[i].n;
n-=a[i].p*a[i].n;
}
else
{
s+=n*1.0/a[i].p;
break;
}
}
printf("%.2lf\n",s);
}
return 0;
}