http://acm.hdu.edu.cn/showproblem.php?pid=1203
分析:题中有两个字“至少”,所以我们可以选择算一个也不可能的概率为多少,再用1减去它,即可获得所要答案。
#include<stdio.h> #include<math.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include <iostream> #include<algorithm> #include<queue> #define maxn 11000 #define oo 0x3f3f3f3f using namespace std; int a[maxn]; double b[maxn],dp[maxn]; int main() { int n, m; while(scanf("%d %d", &n, &m),n+m) { for(int i=1; i<=m; i++) { scanf("%d %lf", &a[i], &b[i]); b[i] = 1-b[i]; } for(int i=0; i<=n; i++) dp[i] = 1; 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%% ", (1-dp[n])*100); } return 0; }