UVa 11181 条件概率

https://vjudge.net/problem/UVA-11181

题意:

有n个人准备去超市逛,其中第i个人买东西的概率是pi。逛完以后你得知有r个人买了东西。根据这一信息,请计算每个人实际买了东西的概率。

思路:

"r个人买了东西"这个事件叫E,"第i个人买东西"这个事件为Ei,则要求的是条件概率

P(E)的话我们可以用全概率公式计算出来,把每一种情况都枚举出来,比如1100出现的概率就是,之后再计算一个P(Ei | E)即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 const int maxn=20+5;
 8 
 9 int n,r;
10 double p[maxn];
11 double ans[maxn];
12 int vis[maxn];
13 
14 void dfs(int k,int cur)
15 {
16     if(cur==r)
17     {
18         double temp=1;
19         for(int i=1;i<=n;i++)
20         {
21             if(vis[i])  temp*=p[i];
22             else temp*=(1-p[i]);
23         }
24         ans[0]+=temp;
25         for(int i=1;i<=n;i++)
26             if(vis[i])
27             ans[i]+=temp;
28     }
29     else
30     {
31         for(int i=k;i<=n;i++)
32         {
33             vis[i]=1;
34             dfs(i+1,cur+1);
35             vis[i]=0;
36         }
37     }
38 }
39 
40 int main()
41 {
42     //freopen("D:\input.txt","r",stdin);
43     int kase=0;
44     while(~scanf("%d%d",&n,&r))
45     {
46         if(n==0 && r==0)  break;
47         memset(ans,0,sizeof(ans));
48         memset(vis,0,sizeof(vis));
49         for(int i=1;i<=n;i++)
50             scanf("%lf",&p[i]);
51         dfs(1,0);
52         printf("Case %d:
",++kase);
53         for(int i=1;i<=n;i++)
54             printf("%.6lf
",ans[i]/ans[0]);
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6682882.html