11181 - Probability|Given

11181 - Probability|Given

题意:

有 n 个人准备去逛超市,其中第 i 个人买东西的概率是 Pi 。逛完以后你得知有 r 个
人买了东西,但不知道是哪 r 个人。请计算每个人实际买了东西的概率。输入 n(1≤n≤20)
和 r(0≤r≤n),
输出每个人实际买了东西的概率。

 

思路:在高中数学有种 东西叫条件概率 

   大佬详解 

 

 1 #include <cctype>
 2 #include <cstdio>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 typedef double LB;
 8 
 9 const int MAXN=50;
10 
11 int n,r,T,Case;
12 
13 LB p[MAXN],a[MAXN];
14 
15 LB Deno;
16 
17 bool vis[MAXN];
18 
19 void DFS(int num,double P,int cnt) {
20     if(num==n+1) {
21         if(cnt==r) {
22             Deno+=P;
23             for(int i=1;i<=n;++i) 
24               if(vis[i]) p[i]+=P;
25         }
26         return;
27     }
28     vis[num]=true;
29     DFS(num+1,P*a[num],cnt+1);
30     vis[num]=false;
31     DFS(num+1,P*(1-a[num]),cnt);
32 }
33 
34 int hh() {
35 //    freopen("haha.in","r",stdin);
36 //    freopen("haha.out","w",stdout);
37     while(scanf("%d%d",&n,&r)) {
38         if(!n&&!r) break;
39         for(int i=1;i<=20;++i) p[i]=.0,vis[i]=false,a[i]=.0;
40         for(int i=1;i<=n;++i) cin>>a[i];
41         Deno=.0;
42         DFS(1,1.0,0);
43         printf("Case %d:\n",++Case);
44         for(int i=1;i<=n;++i) printf("%.6lf\n",p[i]/Deno);
45     }
46     return 0;
47 }
48 
49 int sb=hh();
50 int main(int argc,char**argv) {;}
代码

 

posted @ 2017-09-28 14:44  拿叉插猹哈  阅读(130)  评论(0编辑  收藏  举报