题意:
有n个人,已知每个人在超市买东西的概率为pi。现在已知实际上r个人在
超市买了东西,问实际每个人买了东西的概率。
算法:
就是求已知r个人在超市买东西的条件下每个人在超市买东西的条件概率。
拿样例一的“三选二”为例。
分母怎么求?P=买*买*不买+买*不买*买+不买*买*买=0.092,这是三个人中恰有两个人买东西的概率。
分子怎么求?P(1号买了)=买*买*不买+买*不买*买=0.038,所以在有2个人买了东西的情况下1号买了东西的概率是0.038/0.092≈0.413403
贴个讲解超级棒的链接!http://tech.ddvip.com/2013-12/1386689215206949.html
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
double p[25],ans[25];
int n;
double dfs(int pos,int r,double pi)
{
if(pos == n+1) return r?0.0:pi; //如果n个人中没有选够r个人则为0,反之返回pi
double sum = 0.0;
if(r) //选当前pos位的人
{
sum += dfs(pos+1,r-1,pi*p[pos]);
ans[pos] += sum;
}
sum += dfs(pos+1,r,pi*(1-p[pos]));
return sum;
}
int main()
{
int r,cas = 1;
while(scanf("%d%d",&n,&r)!=EOF)
{
if(n==0 && r==0)
break;
for(int i=1;i<=n;i++)
scanf("%lf",&p[i]);
printf("Case %d:\n",cas++);
memset(ans,0,sizeof(ans));
double q = dfs(1,r,1.0);
for(int i=1;i<=n;i++)
{
printf("%.6lf\n",ans[i]/q);
}
}
return 0;
}