原题链接:UVa11181
解析:求每个人实际买了东西的概率,就是求第i个人买了东西的情况下有r个人买了东西。设有r个人买东西为事件E,第i个人买东西为事件Ei。那么要求的就是p( Ei E ) = p( E * Ei) / p( E )。
代码实例:
#include<cstdio>
#include<cstring>
const int maxn = 20 + 5;
int n, r, buy[maxn];
double P[maxn], sum[maxn];
// depth, current number of 1, and product of probs
void dfs(int d, int c, double prob) {
if(c > r || d - c > n - r) return; // too many 1/0
if(d == n) {
sum[n] += prob;
for(int i = 0; i < n; i++) if(buy[i])
sum[i] += prob;
return;
}
buy[d] = 0;
dfs(d+1, c, prob*(1-P[d]));
buy[d] = 1;
dfs(d+1, c+1, prob*P[d]);
}
int main() {
int kase = 0;
while(scanf("%d%d", &n, &r) == 2 && n) {
for(int i = 0; i < n; i++) scanf("%lf", &P[i]);
memset(sum, 0, sizeof(sum));
dfs(0, 0, 1.0);
printf("Case %d:
", ++kase);
for(int i = 0; i < n; i++)
printf("%.6lf
", sum[i] / sum[n]);
}
return 0;
}
其中sum[i]为第i个人买东西且有r个人买东西的概率,即p( Ei E)。sum[n]为有r个人买东西的概率,即p( E )。