条件概率:
条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为:P(A|B),读作“在B条件下A的概率”。
设A,B 是两个事件,且A不是不可能事件,则称
为在事件A发生的条件下,事件B发生的条件概率。一般地,
,且它满足以下三条件:


(1)非负性;(2)规范性;(3)可列可加性。
--------------------------来自百度
按照公式可求得条件概率的值。
例题:UVA - 11181 Probability|Given
题目大意:
给出n个人去商场的概率,问在有m个人去商场的条件下,第i个人是这m个人之一的概率。
题目分析:
直接利用公式暴力枚举求值即可
(即算出n个人里面有m个人去商场的概率pa,n个人里面有m个人去商场且其中一个是第I个人的概率pb,c=pb/pa)
给出代码:
给出代码:

1 #include <cstdio> 2 #include <iostream> 3 #include <string> 4 #include <set> 5 #include <cmath> 6 #include <algorithm> 7 #include <cstring> 8 #include <vector> 9 #include <string> 10 using namespace std; 11 int n,m; 12 int mark[30+10]; 13 double num[20+10]; 14 double num1[20+10]; 15 double dfs(int now,int cnt,int flag=-1) 16 { 17 // cout<<now<<endl; 18 if(cnt==m) 19 { 20 double ps=1; 21 for(int i=0; i<n; i++) 22 { 23 if(mark[i]) 24 ps*=num[i]; 25 else 26 ps*=(1-num[i]); 27 } 28 return ps; 29 } 30 if(now==n-1) 31 { 32 if(cnt==m) 33 { 34 double ps=1; 35 for(int i=0; i<n; i++) 36 { 37 if(mark[i]) 38 ps*=num[i]; 39 else 40 ps*=(1-num[i]); 41 } 42 return ps; 43 } 44 else 45 return 0; 46 } 47 else 48 { 49 double pa=0; 50 for(int i=now+1; i<n; i++) 51 { 52 if(flag==-1||i!=flag) 53 { 54 mark[i]=1; 55 pa+=dfs(i,cnt+1); 56 mark[i]=0; 57 } 58 else 59 { 60 pa+=dfs(i,cnt); 61 } 62 // pa+=dfs(i,cnt); 63 } 64 return pa; 65 } 66 } 67 int main() 68 { 69 //cout<<a.length()<<endl; 70 // freopen("D:\output.txt", "w", stdout); 71 int kase=0; 72 while(cin>>n>>m) 73 { 74 if(n==0&&m==0) 75 break; 76 for(int i=0; i<n; i++) 77 scanf("%lf",&num[i]); 78 double pa=0; 79 for(int i=0; i<n; i++) 80 { 81 mark[i]=1; 82 pa+=dfs(i,1); 83 mark[i]=0; 84 // pa+=dfs(i,0); 85 } 86 // cout<<pa<<endl; 87 printf("Case %d: ",++kase); 88 if(m>=2) 89 { 90 int h=n; 91 n=n-1; 92 m=m-1; 93 for(int i=0; i<h; i++) 94 num1[i]=num[i]; 95 for(int i=0; i<h; i++) 96 { 97 int cnt=0; 98 for(int j=0; j<h; j++) 99 { 100 if(i!=j) 101 num[cnt++]=num1[j]; 102 } 103 double pb=0; 104 for(int j=0; j<n; j++) 105 { 106 mark[j]=1; 107 pb+=dfs(j,1); 108 mark[j]=0; 109 } 110 pb=pb*num1[i]; 111 //cout<<pb/pa<<endl; 112 printf("%.6lf ",pb/pa); 113 } 114 } 115 else if(m==1) 116 { 117 //double 118 for(int i=0;i<n;i++) 119 { 120 double pb=1; 121 for(int j=0;j<n;j++) 122 { 123 if(j==i) 124 pb*=num[j]; 125 else 126 pb*=(1-num[j]); 127 } 128 // cout<<pb<<" *"<<endl; 129 printf("%.6lf ",pb/pa); 130 } 131 } 132 else if(m==0) 133 { 134 // cout<<"***"<<endl; 135 for(int i=0;i<n;i++) 136 printf("%.6lf ",0.0); 137 } 138 } 139 return 0; 140 } 141 /* 142 7 1 143 0.48 144 0.19 145 0.33 146 0.64 147 0.74 148 0.46 149 0.6 150 */
说实话这题代码我写的不怎么好==