首页 > 代码库 > UVa 11181 条件概率

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     else30     {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:\n",++kase);53         for(int i=1;i<=n;i++)54             printf("%.6lf\n",ans[i]/ans[0]);55     }56     return 0;57 }

 

UVa 11181 条件概率