题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int a;
double b;
}N[10010];
double dp[10010];
int main()
{
int n,m;
while(scanf("%d%d",&m,&n)!=EOF&&(m+n))
{
for(int i=1;i<=n;i++)
{
scanf("%d%lf",&N[i].a,&N[i].b);
N[i].b=1-N[i].b;
}
for(int i=0;i<=m;i++)
dp[i]=1.0;
for(int i=1;i<=n;i++)
for(int j=m;j>=N[i].a;j--) //至少一份的最大概率等于一份也没有的最小概率
{
dp[j]=min(dp[j],dp[j-N[i].a]*N[i].b);
}
printf("%.1lf%%\n",(1-dp[m])*100);
}
return 0;
}