题意
有n个人准备去超市逛,其中第i个人买东西的概率是pi。逛完以后你得知有r个人买了东西。根据这一信息,请计算每个人实际买了东西的概率。
分析
记r个人买了东西的事件为E,第i个买东西的事件为Ei,
按照紫书上的思路来做,要求的是每个条件概率P(Ei|E)
而我们只需要dfs所有情况,把可能的情况找出来,然后根据全概率公式计算
代码
#include<bits/stdc++.h> using namespace std; #define N 22 #define db double int n,r,t,vis[N]; db p[N],ans[N]; inline void dfs(int k,int cur) { if(cur==r) { db tmp=1; for(int i=1;i<=n;i++) if(vis[i]) tmp*=p[i]; else tmp*=(1-p[i]); ans[0]+=tmp; for(int i=1;i<=n;i++) if(vis[i]) ans[i]+=tmp; } else { for(int i=k;i<=n;i++) { vis[i]=1; dfs(i+1,cur+1); vis[i]=0; } } } int main() { while(scanf("%d%d",&n,&r)&&n) { memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++)scanf("%lf",&p[i]); dfs(1,0); printf("Case %d: ",++t); for(int i=1;i<=n;i++)printf("%.6lf ",ans[i]/ans[0]); } }