题意:
有n个人准备去超市逛,其中第i个人买东西的概率是pi。逛完以后你得知有r个人买了东西。根据这一信息,请计算每个人实际买了东西的概率。
分析:
设"r个人买了东西"这个事件叫B,"第i个人买东西"这个事件为Ai,则要求的是条件概率P(Ai|B) = P(AiB)/P(B)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=20+5;
int n,r;
double p[maxn];
double ans[maxn];
int vis[maxn];
void dfs(int k,int cur)
{
if(cur==r)
{
double temp=1;
for(int i=1;i<=n;i++)
{
if(vis[i]) temp*=p[i];
else temp*=(1-p[i]);
}
ans[0]+=temp;
for(int i=1;i<=n;i++)
if(vis[i])
ans[i]+=temp;
}
else
{
for(int i=k;i<=n;i++)
{
vis[i]=1;
dfs(i+1,cur+1);
vis[i]=0;
}
}
}
int main()
{
//freopen("D:\\input.txt","r",stdin);
int kase=0;
while(~scanf("%d%d",&n,&r))
{
if(n==0 && r==0) break;
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%lf",&p[i]);
dfs(1,0);
printf("Case %d:\n",++kase);
for(int i=1;i<=n;i++)
printf("%.6lf\n",ans[i]/ans[0]);
}
return 0;
}