uva11181(条件概率)

来源:互联网 发布:威少西部决赛数据 编辑:程序博客网 时间:2024/06/10 01:50

题目大意:

       现在有n个人去超市逛,其中第i个人买东西的概率是Pi。逛完以后你得知有r个人买了东西,输出每个人实际买了东西的概率。


题目分析:

       E:r个人买了东西,Ei:第i个人买了东西,则题目所求的为P(E|Ei)。

       根据条件概率公式,P(E|Ei)=P(EEi)/P(E)。而求P(E)可以用全概率公式,利用二进制枚举出可能的情况,然后分别算出这些情况发生的概率,这些概率之和即是P(E)的值,至于P(EEi)可以在计算P(E)时,对于所有可能的情况分别判断第i个人是否买了东西,如果是P(EEi)的值加上这种情况的概率即可。


代码:

#include <cmath>#include <vector>#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int maxn=20+5;int n,r,Case=1;double all;int num[maxn];double p[maxn],out[maxn];int Count(int m,string& str){    int cnt=0;    while(m)    {        if(m&1){            cnt++;            str+="1";        } else {            str+="0";        }        m>>=1;    }    while((int)str.length()<n)    {        str+="0";    }    return cnt;}void print(){    printf("Case %d:\n",Case++);    for(int i=1;i<=n;i++){        printf("%.6lf\n",out[i]/all);    }}int main(){//    freopen("in.txt","r",stdin);//    freopen("out.txt","w",stdout);    ios::sync_with_stdio(false);    while(cin>>n>>r)    {        all=0;        if(!n&&!r)  break;        for(int i=1;i<=n;i++){            out[i]=0;            cin>>p[i];        }        for(int k=0;k<pow(2,n);k++){            string s;            if(Count(k,s)==r){                double p1=1;                for(int j=0;j<n;j++){                    if(s[j]=='1'){                        p1=p1*p[j+1];                    } else {                        p1=p1*(1-p[j+1]);                    }                }                all+=p1;                for(int j=0;j<n;j++){                    if(s[j]=='1'){                        out[j+1]+=p1;                    }                }            }        }        print();    }    return 0;}


原创粉丝点击