题意:
有n个人去超市买东西
Pi 为 i 买东西的概率
逛完后 得知有 r 人买了东西
输出每人买东西的概率
有R 人买了东西的事件为 E , 第 I 人买了东西的 事件为 Ai
题目求的是 P(Ai | E ) = P ( Ai E ) / P(E)
P(E)即为 正好有r 人买了东西的概率和
而 一组r 人买了东西概率 为 Bi
第 i 人买了东西的 概率为 Bi 之和
P(Ai E) = P(Ai )//发生了Ai 则一定发生 E 0.0
故答案为 P(Ai) / P(E)
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
double Pi[25],Sum[25];
int vis[25];
double tot;
int n, r;
void DFS(int k,int Count) {
if(Count == r) {
double tmp = 1;
for(int i = 0; i < n; ++i)
{
if(vis[i]) tmp *= Pi[i];
else tmp *= (1 - Pi[i]);
}
tot += tmp;
for(int i = 0; i < n; ++i) {
if(vis[i]) Sum[i] += tmp;
}
}
else for(int i = k+1; i < n; ++i) {
vis[i] = 1;
DFS(i,Count+1);
vis[i] = 0;
}
}
int main() {
int kase = 1;
while(cin >> n >> r && (n + r)) {
for(int i = 0; i < n; ++i) cin >> Pi[i];
memset(vis,0,sizeof(vis));
memset(Sum,0,sizeof(Sum));
tot = 0;
printf("Case %d:\n",kase++);
DFS(-1,0);
for(int i = 0; i < n; ++i) {
printf("%.06lf\n",Sum[i] / tot);
}
}
return 0;
}