条件概率。
求出所有可能的概率的和p。 然后求 某一个人买东西的 概率 pi 用 pi / p 就OK了。
这个地方就是 回溯 来表示 某个人是否买了东西。
简单的回溯。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
#define ll long long
typedef unsigned long long ull;
#define maxn 1000+10
#define INF 1<<30
double s[maxn];
int vis[maxn];
double af[maxn];
int n,r;
double tot;
int dfs(int a){
if(a == n){
int num = 0;
for(int i = 0; i < n ; i ++)
if(vis[i])
num++;
if(num != r)
return 1;
double sum = 1;
for(int i = 0; i < n; i++){
if(vis[i]) {sum *= s[i];}
else sum *= (1 - s[i]);
}
tot += sum;
for(int i = 0; i < n; i++)
if(vis[i])
af[i] += sum;
}
else {
for(int i = 0; i < 2; i++){
vis[a] = i;
dfs(a+1);
}
}
}
int main (){
int counts = 0;
while(scanf("%d%d",&n,&r)){
if(n == 0 && r ==0)
break;
memset(vis,0,sizeof(vis));
memset(s,0,sizeof(s));
memset(af,0,sizeof(af));
tot = 0;
for(int i = 0; i < n; i++)
scanf("%lf",&s[i]);
for(int i = 0; i < 2; i++){
vis[0] = i;
dfs(1);
}
printf("Case %d:\n",++counts);
for(int i = 0; i < n; i++){
printf("%.6lf\n",af[i]/tot);
}
}
return 0;
}