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) {;}