UVA11181离散条件概率

题意:

有n个人准备去超市逛,其中第i个人买东西的概率是pi。逛完以后你得知有r个人买了东西。根据这一信息,请计算每个人实际买了东西的概率。

分析:

设"r个人买了东西"这个事件叫B,"第i个人买东西"这个事件为Ai,则要求的是条件概率P(Ai|B) = P(AiB)/P(B)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

const int maxn=20+5;

int n,r;
double p[maxn];
double ans[maxn];
int vis[maxn];

void dfs(int k,int cur)
{
    if(cur==r)
    {
        double temp=1;
        for(int i=1;i<=n;i++)
        {
            if(vis[i])  temp*=p[i];
            else temp*=(1-p[i]);
        }
        ans[0]+=temp;
        for(int i=1;i<=n;i++)
            if(vis[i])
            ans[i]+=temp;
    }
    else
    {
        for(int i=k;i<=n;i++)
        {
            vis[i]=1;
            dfs(i+1,cur+1);
            vis[i]=0;
        }
    }
}

int main()
{
    //freopen("D:\\input.txt","r",stdin);
    int kase=0;
    while(~scanf("%d%d",&n,&r))
    {
        if(n==0 && r==0)  break;
        memset(ans,0,sizeof(ans));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
            scanf("%lf",&p[i]);
        dfs(1,0);
        printf("Case %d:\n",++kase);
        for(int i=1;i<=n;i++)
            printf("%.6lf\n",ans[i]/ans[0]);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qihang_qihang/article/details/79532075
今日推荐