UVA11181 条件概率 Probability|Given 题解
前置知识
解法
观察到 \(n \le 20\),考虑状压枚举所有可能的状态。
令 \(A\) 表示恰好有 \(r\) 个人买了东西,\(B_{i}\) 表示第 \(i\) 个人买了东西。由条件概率 \(P(B_{i}|A)=\frac{P(AB_{i})}{P(A_{i})}\),分别计算 \(P(AB_{i})\) 和 \(P(A_{i})\) 相除得到结果。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
double p[50],f[50];
int main()
{
int n,r,cnt=0,i,j;
double sum,num;
while(cin>>n>>r)
{
if(n==0&&r==0)
{
break;
}
else
{
cnt++;
sum=0;
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
cin>>p[i];
}
for(i=0;i<=(1<<n)-1;i++)
{
if(__builtin_popcount(i)==r)
{
num=1;
for(j=0;j<=n-1;j++)
{
num*=((i>>j)&1)?p[j+1]:1-p[j+1];
}
for(j=0;j<=n-1;j++)
{
f[j+1]+=((i>>j)&1)*num;
}
sum+=num;
}
}
cout<<"Case "<<cnt<<":"<<endl;
for(i=1;i<=n;i++)
{
printf("%.6lf\n",f[i]/sum);
}
}
}
return 0;
}
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18275761,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。