题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
思路:求可能得到至少一份offer的最大概率,我们可以求它的相反事件:一份offer都得不到的最小概率
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include <limits>
using namespace std;
typedef long long ll;
int a[10005];
double b[10005];
double dp[10005];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&(n+m)!=0){
for(int i=1;i<=m;i++)
{
scanf("%d%lf",&a[i],&b[i]);
b[i]=1-b[i];
}
// memset(dp,0,sizeof(dp));
for(int i=0;i<=n;i++)
dp[i]=1.0;
for(int i=1;i<=m;i++)
{
for(int j=n;j>=a[i];j--)
{
dp[j]=min(dp[j],dp[j-a[i]]*b[i]);
}
}
printf("%.1f%%\n",100*(1.0-dp[n]));
}
return 0;
}
我一定可以的!!!