11181 - Probability|Given

条件概率。

数据量太小了, 暴力吧!

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<stack>
 9 #include<map>
10 #include<set>
11 #include<string>
12 #include<vector>
13 #include<iterator>
14 #include<cctype>
15 #include<iomanip>
16 using namespace std;
17 
18 #define MAX 1000
19 int bit[100];
20 double p[100];
21 double a[100], b;
22 int main(){
23     int n, r;
24     int k = 0;
25     while(scanf("%d%d", &n, &r) == 2){
26         if(n == 0 && r == 0) break;
27         for(int i = 0; i < n; ++i)
28             scanf("%lf",&p[i]);
29         memset(bit,0,sizeof(bit));
30         for(int i = n - 1,j = 0;j < r && i >= 0; --i, ++j)
31             bit[i] = 1;
32         for(int i = 0; i < n; ++i) a[i] = 0.0;
33         b = 0.0;
34         do{
35             double tmp = 1.0;
36             for(int i = 0; i < n; ++i){
37                 if(bit[i]){
38                     tmp *= p[i];
39                 }
40                 else tmp *= 1.0 - p[i];
41             }
42             b += tmp;
43             for(int i = 0; i < n; ++i){
44                 if(bit[i]) a[i] += tmp;
45             }
46         }while(next_permutation(bit,bit + n));
47         printf("Case %d:\n", ++k);
48         for(int i = 0; i < n; ++i){
49             printf("%.6lf\n", a[i] / b);
50         }
51     }
52     return 0;
53 }

 

posted @ 2013-02-06 18:25  ACSeed  Views(93)  Comments(0)    收藏  举报