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 }
View Code

 

posted @ 2015-10-11 21:31  cdongyang  阅读(255)  评论(0编辑  收藏  举报