原题链接:
解析:求每个人实际买了东西的概率,就是求第i个人买了东西的情况下有r个人买了东西。设有r个人买东西为事件E,第i个人买东西为事件Ei。那么要求的就是p( Ei E ) = p( E * Ei) / p( E )。
代码实例:
#include#include const int maxn = 20 + 5;int n, r, buy[maxn];double P[maxn], sum[maxn];// depth, current number of 1, and product of probsvoid 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:\n", ++kase); for(int i = 0; i < n; i++) printf("%.6lf\n", sum[i] / sum[n]); } return 0;}
其中sum[i]为第i个人买东西且有r个人买东西的概率,即p( Ei E)。sum[n]为有r个人买东西的概率,即p( E )。