UVa11181 条件概率

原题链接: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 )。

原文地址:https://www.cnblogs.com/long98/p/10352212.html