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:\n",++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\n");
            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\n",sum[i]/tot);
    }
    return 0;
}
时间: 2024-10-08 06:45:06

uva11181Probability|Given的相关文章

UVA11181Probability|Given(条件概率)

题目链接 紫书P327 题意:有n个人准备去超市逛,其中第i个人买东西的概率是 Pi .逛完以后你得知有 r 个人买了东西.根据这一信息,计算每个人实际买东西的概率.输入 n ( 1 <= n <= 20 )和r( 0 <= r <= n) 输出每个人实际买了的东西概率 分析: “ r 个人买了东西 ” 这个事件叫做E, “ 第 i 个人买东西 ”这个事件叫做 Ei ,要求的就是 P( Ei | E ) = P ( Ei E) / P ( E ) : P(E)的求法利用全概率公式,