条件概率的计算

条件概率:

条件概率是指事件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:\n",++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\n",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\n",pb/pa);
130             }
131         }
132         else if(m==0)
133         {
134            // cout<<"***"<<endl;
135             for(int i=0;i<n;i++)
136                 printf("%.6lf\n",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 */
View Code

说实话这题代码我写的不怎么好==

posted @ 2017-07-27 19:42  DLKKILL  阅读(2410)  评论(0编辑  收藏  举报