http://acm.hdu.edu.cn/showproblem.php?pid=1203
简单的01背包问题,f[j]表示每个学校都落选的最小概率,状态转移方程 f[j]=min(f[j],f[j-a[i]]*(1-b[i])
#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;
int main()
{
int n,m;
int a[10010];
double b[10010];
double f[1010];
//freopen("G:/in.txt", "r", stdin);
while(cin>>n>>m){
if(n==0&&m==0) break;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int j=0;j<=n;j++)
f[j]=1; //最初 i=0的时候 ,没选学校,自然落选是肯定的,为1
for(int i=1;i<=m;i++)
cin>>a[i]>>b[i];
//f[j]表示每个学校都落选的最小概率
//f[j]=min(f[j],f[j-a[i]]*(1-b[i])
for(int i=1;i<=m;i++)
for(int j=n;j>=a[i];j--){
if(f[j]>f[j-a[i]]*(1-b[i])) f[j]=f[j-a[i]]*(1-b[i]);
}
printf("%0.1lf%%\n",(1-f[n])*100);
}
return 0;
}