题意:n个人去购物,恰好有r个人买了商品,其他人不买,求第i个人买商品的概率
解析:直接根据条件概率的定义来
P(A|B) = P(AB)/P(B)
在这道题中B就是r个人买了东西
A就是某个人买了东西
然后考虑所有情况的概率,累加起来求的各个事件的概率
开始枚举所有的组合都不会写了,后来想想就是用类似dp的思想,dfs实现就好了
#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
using namespace std;
#define N 25
double p[N],ans[N];
int vis[N],n,r;
void dfs(int k,int num)
{
int i;
double temp;
if(num==r)
{
temp=1;
for(i=1; i<=n; i++)
{
if(vis[i]) temp*=p[i];
else temp*=(1-p[i]);
}
ans[0]+=temp;
for(i=1; i<=n; i++)
if(vis[i])
ans[i]+=temp;
}
else
{
for(i=k+1;i<=n;i++)
{
vis[i]=1;
dfs(i,num+1);
vis[i]=0;
}
}
}
int main()
{
int i,t=1;
while(scanf("%d%d",&n,&r)&&(n+r))
{
for(i=0; i<N; i++)
{
vis[i]=0;
ans[i]=0;
}
for(i=1; i<=n; i++)
{
scanf("%lf",&p[i]);
}
dfs(0,0);
printf("Case %d:\n",t++);
for(i=1;i<=n;i++)
printf("%.6lf\n",ans[i]/ans[0]);
}
return 0;
}