集训第六周 数学概念与方法 UVA 11181 条件概率
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18546
题意:有n个人会去超市,其中只有r个人会买东西,每个人独自买东西的概率会给出,问这一群人去买东西,第i个人属于r之中的概率是多少
思路:首先得了解什么是条件概率.
条件概率:事件A在事件B成立的基础上再成立的概率,公式为:P(A|B)=P(A*B)/P(B)
可以照着题目案例1进行分析:
输入
0.10
0.20
0.30
输出
0.413043
0.739130
0.847826
由于是哪r个人是未知的,那么就得进行枚举
把这三个人编号为1 2 3
P(1 2)=0.1*0.2*0.7=0.014,那么P(1)=0.014,P(2)=0.014,P(B)=0.014
P(1 3)=0.1*0.3*0.8=0.024,那么P(1)=0.014+0.024=0.038 P(3)=0.024 P(B)=0.038
P(2 3)=0.2*0.3*0.9=0.054,那么P(2)=0.014+0.054=0.068 P(3)=0.024+0.054=0.078 P(B)=0.092
因此
P(A1|B)=P(1)/P(B)=0.413043
P(A2|B)=P(2)/P(B)=0.739130
P(A3|B)=P(3)/P(B)=0.847826
所以这道题的解法就出来啦:枚举所有排列,累加概率,循环输出
#include"iostream" #include"cstdio" #include"cstring" using namespace std; const int maxn=30; double sum[maxn]; double ans; double P[maxn]; int buy[maxn]; int n,r; void Init() { for(int i=0;i<n;i++) { scanf("%lf",&P[i]); } memset(sum,0,sizeof(sum)); fill(buy,buy+maxn,1); ans=0; } void DFS(int d,int c,double pro) { if(c>r||d-c>n-r) return; if(d==n) { ans+=pro; //cout<<pro<<endl; for(int i=0;i<n;i++) if(buy[i]) {sum[i]+=pro;} //cout<<endl; } buy[d]=0; DFS(d+1,c,(1-P[d])*pro); buy[d]=1; DFS(d+1,c+1,P[d]*pro); } int main() { int ca=1; while(scanf("%d%d",&n,&r)&&n) { Init(); DFS(0,0,1.0); cout<<"Case "<<ca++<<':'<<endl; for(int i=0;i<n;i++) printf("%.6f\n",sum[i]/ans); } return 0; }