分析:这题和抢劫银行是一样的。至少获得一个学校的概率等于1 减去一个offer都不获得。
所以转变为一个都不获得的最小值。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,v[10010];
float p[10010],dp[10010];
float ZeroOnePack()
{
for(int i=0;i<=m;i++)
dp[i]=1;
for(int i=1;i<=n;i++)
for(int j=m;j>=v[i];j--)
dp[j]=min(dp[j],dp[j-v[i]]*(1-p[i]));
return (1-dp[m]);
}
int main()
{
while (scanf("%d%d",&m,&n)!=EOF)
{
if(n==0&&m==0) break;
for(int i=1;i<=n;i++)
scanf("%d%f",&v[i],&p[i]);
printf("%.1f%%\n",ZeroOnePack()*100);
}
return 0;
}