UVA11181条件概率 Probability|Given

条件概率 Probability|Given - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

样例解释:

需要学习条件概率贝叶斯定理 

//1 2 -		0.1*0.2*(1-0.3)  == 0.014
//1 - 3		0.1*0.8*0.3 == 0.024
//- 2 3		0.9*0.2*0.3 == 0.054
//						   0.092

//(0.014+0.024)/0.092 == 0.413043

包含1的概率 除以 所有情况的概率之和  就是1买到东西的概率

(所有情况是这里r==2时的所有情况)

接下来可以欣赏洛谷题解了。

代码:

我用的状态压缩(即二进制表示)来做的。

暴力r符合的情况做统计,就是根据上面贝叶斯公式来计算。

double arr[25] = { 0 };
double dp[25][1ll << 20];
signed main()
{
	//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t = 1;
	//cin >> t;
	//for (int i = 1; i <= t; i++)
	//{
	//	solve(i);
	//}
	int n, r;
	int round = 1;
	while (1)
	{
		cin >> n >> r;
		if (n == 0 && r == 0)
			break;
		for (int i = 0; i < n; i++)
		{
			cin >> arr[i];
		}
		double asum = 0;
		double sum[22] = { 0 };
		for (int i = 0; i < (1ll<<20); i++)
		{
			//如果是r个
			int cnt = 0;
			for (int j = 0; j < n; j++)
			{
				if ((i >> j & 1) == 1)
					cnt++;
			}
			if (cnt != r)
				continue;
			double tmp = 1;
			for (int j = 0; j < n; j++)
			{
				if ((i >> j & 1) == 1)
					tmp *= arr[j];
				else
					tmp *= (1 - arr[j]);
			}
			for (int j = 0; j < n; j++)
			{
				if ((i >> j & 1) == 1)
				{
					sum[j] += tmp;
				}
			}
			asum += tmp;
		}
		cout << "Case "<< round++ << ":" << endl;
		for (int i = 0; i < n; i++)
		{
			printf("%.6lf\n", sum[i] / asum);
		}

	}
	return 0;
}

你可能感兴趣的:(洛谷,算法,概率论)