洛谷题单指南-概率与统计-UVA11181 条件概率 Probability|Given
原题链接:https://www.luogu.com.cn/problem/UVA11181
题意解读:n个人每个人买到东西概率不同,第i个买到的概率是pi,已知r人买到了东西,求此条件下每个人买到东西的概率。
解题思路:
设第i个人买到东西的事件为Ai,r个人买到东西事件为B
要求P(Ai | B),根据条件概率公式可知:
P(Ai | B) = P(Ai ∩ B) / P(B)
P(B)是r个人买到东西的概率,可以通过二进制枚举所有状态,对于恰好r个人买到东西的情况,计算概率(买到东西人乘pi,没买到的乘(1-pi))累加到P(B)。
P(Ai ∩ B) 是在Ai买到的情况下,另外r-1个人买到东西的概率,也可以通过二进制枚举所有状态,当恰好r-1个人买到的情况并且不包含第i个人,计算概率累加到P(Ai ∩ B) 。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
double p[N], pab[N], pb;
int n, r;
int main()
{
int t = 0;
while(cin >> n >> r)
{
if(n == 0 && r == 0) break;
pb = 0;
memset(pab, 0, sizeof(pab));
for(int i = 0; i < n; i++) cin >> p[i];
for(int i = 0; i < 1 << n; i++)
{
int cnt = 0;
double pt = 1.0;
for(int j = 0; j < n; j++)
{
if(i >> j & 1) cnt++, pt *= p[j];
else pt *= (1.0 - p[j]);
}
if(cnt == r - 1)
{
for(int j = 0; j < n; j++)
{
if(i >> j & 1) continue;
pab[j] += p[j] * pt / (1 - p[j]); //pt是买到r-1个的概率,pab[j]是买第j个且买到其他r-1个的概率
}
}
if(cnt == r) pb += pt;
}
printf("Case %d:\n", ++t);
for(int i = 0; i < n; i++) printf("%.6lf\n", pab[i] / pb);
}
}
浙公网安备 33010602011771号