题目链接:Probability|Given UVA - 11181
题目大意:有n个人去超市买东西,每个人买东西的概率为p[i]。求当有r个人买东西时,每个人实际买东西的概率。
条件概率p(a|b)=p(ab)/p(b),可以通过dfs枚举所有情况进行求解。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=20+5;
double ans[N],p[N];
int n,r;
double dfs(int cur,int cnt,double pp) //通过递归来枚举各种情况
{
if(cur>n)
return cnt? 0:pp;
double sum=0;
if(cnt)
{
sum+=dfs(cur+1,cnt-1,pp*p[cur]);
ans[cur]+=sum;
}
sum+=dfs(cur+1,cnt,pp*(1-p[cur]));
return sum;
}
int main()
{
int casenum=1;
while(~scanf("%d%d",&n,&r)&&(n||r))
{
for(int i=1;i<=n;i++)
scanf("%lf",&p[i]);
memset(ans,0,sizeof(ans));
double all=dfs(1,r,1);
printf("Case %d:\n",casenum++);
for(int i=1;i<=n;i++)
printf("%lf\n",ans[i]/all); //p(a|b)=p(ab)/p(b)
}
return 0;
}