#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
inline double max(double a,double b)
{
return a>b?a:b;
}
int main()
{
int n,m,i,j;
int c[1010];
double w[1010],dp[100010],temp;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(n==0&&m==0) break;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d%lf",&c[i],&w[i]);
for(i=1;i<=n;i++)
{
for(j=m;j>=c[i];j--)
{
temp=1.0-(1.0-dp[j-c[i]])*(1-w[i]);
dp[j]=max(dp[j],temp);
}
}
printf("%.1lf%%\n",dp[m]*100);
}
return 0;
}
注:01背包
for(i=1;i<=N;i++)
for(j=V;j>=0;j--)
f[j]=max(f[j],f[j-c[i]]+w[i]);
f[j]代表前i件物品放在容量为j的背包的价值,第i件物品可以选择放或不放,如果不放入,则还是f[j],如果放入,则是f[j]=f[j-c[i]]+w[i]。