UVA11181 条件概率 Probability|Given 题解

题目传送门

前置知识

状压 DP | 条件概率

解法

观察到 \(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;
}
posted @ 2024-06-29 21:36  hzoi_Shadow  阅读(18)  评论(0编辑  收藏  举报
扩大
缩小