/*
translation:
已知有n个人,其中有r个人买东西。已知每个人买东西的概率为p[i],求实际每个人
买东西的概率?
solution:
概率
设Ei为事件:第i个人买东西,E:有r人买东西。则答案就是求p(Ei|E).
如此以来,用dfs枚举每个人买或者不买。即可求出来p(E)和p(Ei*E)
note:
date: 2016.9.28
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 25;
double p[maxn], mp;
int n ,r;
double a[maxn];
bool flag[maxn]; //代表第i个是否购买
void dfs(int d, int cnt, double ap) { //层数,1的个数,概率
if(cnt > r || d - cnt > n - r) return;
if(d == n) {
mp += ap;
for(int i = 0; i < n; i++)
if(flag[i]) p[i] += ap;
return;
}
flag[d] = false;
dfs(d+1, cnt, ap*(1-a[d]));
flag[d] = true;
dfs(d+1, cnt+1, ap*a[d]);
}
int main()
{
//freopen("in.txt", "r", stdin);
int kase = 0;
while(~scanf("%d%d", &n, &r) && n) {
for(int i = 0; i < n; i++) scanf("%lf" ,&a[i]);
memset(p, 0, sizeof(p)); mp = 0;
memset(flag, 0, sizeof(flag));
dfs(0, 0, 1.0);
printf("Case %d:\n", ++kase);
for(int i = 0; i < n; i++) printf("%.6lf\n", p[i]/mp);
}
return 0;
}
uva11181(概率)
最新推荐文章于 2020-05-30 18:58:46 发布