uva11181(概率)

/*
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值