uva11181Probability|Given

枚举,条件概率。

2^20次方等于100w,是大约可以没准还能过的。

二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),tot+=p(tot为r个人买东西的概率)

要求的就是sum[i]/tot。

P(第i个人实际买东西)=P(r个人买东西且第i个人在其中)/P(r个人买东西)。

r为0时特判

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 20 + 10;
int n,r,N,cnt,kase;
double a[maxn],sum[maxn];
double tot,p;

int main() {
    kase=0;
    while(scanf("%d%d",&n,&r)==2) {
        printf("Case %d:
",++kase);
        if(!n&&!r) break;
        for(int i=0;i<n;i++) scanf("%lf",&a[i]);    
        if(!r) {
            for(int i=0;i<n;i++) printf("0.000000
");    
            continue;
        }
        N=1<<n;
        memset(sum,0,sizeof(sum)); tot=0;
        for(int i=1;i<N;i++) {
            cnt=0; p=1;
            for(int j=0;j<n;j++) {
                if(i&(1<<j)) {cnt++; p*=a[j];}
                else p*=(1-a[j]);
            }
            if(cnt==r) {
                for(int j=0;j<n;j++) if(i&(1<<j)) sum[j]+=p;
                tot+=p;
            }
        }
        for(int i=0;i<n;i++) printf("%.6lf
",sum[i]/tot);
    }    
    return 0;    
}
原文地址:https://www.cnblogs.com/invoid/p/5575467.html