题意: 求N个人在超市购物,其中r购物,其他人不购物,求第i个人有购物的概率,先DFS求出N个人r个人购物的概率,然后利用条件概率的公式:P=P(A*I)/P(A),求出每个人的概率
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN = 30;
int N,r,vis[MAXN];
double pro[MAXN],p[MAXN],P;
void solve(int st,int n){
if (n == r){
double x = 1;
for (int i = 0; i < N; i++)
if (vis[i] == 1)
x *= pro[i];
else x *= 1.0-pro[i];
for (int i = 0; i < N; i++)
if (vis[i])
p[i] += x;
P += x;
return;
}
for (int i = st; i < N; i++){
vis[i] = 1;
solve(i+1,n+1);
vis[i] = 0;
}
}
int main(){
int cas = 1;
while (scanf("%d%d",&N,&r) != EOF && N+r){
for (int i = 0; i < N; i++)
scanf("%lf",&pro[i]),p[i] = 0;
printf("Case %d:\n",cas++);
P = 0;
memset(vis,0,sizeof(vis));
solve(0,0);
for (int i = 0; i < N; i++)
printf("%lf\n",p[i]/P);
}
return 0;
}