UVA 11181 Probability|Given
条件概率,r个人买东西的条件下第i个人买东西的概率P(Ai|B)。而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,p(B)为B事件发生的概率
第一个样例
3 2
0.10
0.20
0.30
p(B)为两个人买东西的概率,p(AiB)为此时第i个人买东西的概率。两个人买东西,可以是1,2买,p为0.1*0.2*(1-0.3)=0.014;1,3买为0.024;2,3买为0.054,
则p(B)=0.014+0.024+0.054,p(A1B)=0.014+0.024,p(A2B)=0.014+0.054,p(A3B)=0.024+0.054,然后各个除以p(B)即可
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 int n,r,cas=1,buy[25]; 8 double p[25],sum[25],tot; 9 10 void Cmn(int x,int num) 11 { 12 if(num>=r) 13 { 14 double pi=1; 15 for(int i=0;i<n;i++) 16 if(buy[i]) pi*=p[i]; 17 else pi*=1-p[i]; 18 tot+=pi; 19 for(int i=0;i<n;i++) 20 if(buy[i]) sum[i]+=pi; 21 return; 22 } 23 if(x>=n) return; 24 for(int i=x;i<=n-r+num;i++) 25 { 26 buy[i]=1; 27 Cmn(i+1,num+1); 28 buy[i]=0; 29 } 30 } 31 32 /* 33 void Cmn(int x,int num) 34 { 35 if(num>=r) 36 { 37 double pi=1; 38 for(int i=0;i<n;i++) 39 if(buy[i]) pi*=p[i]; 40 else pi*=1-p[i]; 41 tot+=pi; 42 for(int i=0;i<n;i++) 43 if(buy[i]) sum[i]+=pi; 44 return; 45 } 46 if(x>n-r+num) return; 47 buy[x]=1; 48 Cmn(x+1,num+1); 49 buy[x]=0; 50 Cmn(x+1,num); 51 } 52 */ 53 int main() 54 { 55 while(scanf("%d%d",&n,&r)==2&&(n||r)) 56 { 57 printf("Case %d:\n",cas++); 58 for(int i=0;i<n;i++) 59 scanf("%lf",&p[i]); 60 memset(sum,0,sizeof(sum)); 61 memset(buy,0,sizeof(buy)); 62 tot=0; 63 Cmn(0,0); 64 for(int i=0;i<n;i++) 65 printf("%.6lf\n",sum[i]/tot); 66 } 67 return 0; 68 }