zoukankan      html  css  js  c++  java
  • uva 11181 Probability|Given

    https://vjudge.net/problem/UVA-11181

    有n个人准备去超市逛,其中第i个人买东西的概率是P i 。逛完以后你得知有r个人买了东
    西。根据这一信息,请计算每个人实际买了东西的概率。输入n(1≤n≤20)和r(0≤r≤n),
    输出每个人实际买了东西的概率。

    事件A:n个人中有r个人买东西

    事件B:第i个人买东西

    在事件A的前提下事件B发生的概率=P(B)/P(A)

    P(A):

    假设有3个人

    那所有的可能情况为 000  001  010  011 100 101 110 111

    有2个人买东西:011  101  110

    那么P(A)= (1-p[1])*p[2]*p[3]  +  p[1]*(1-p[2])*p[3]  +  p[1]*p[2]*(1-p[3])

    P(B):

    假设第1个人

    011  101  110  只有  101  110 符合要求

    P(B)= p[1]*(1-p[2])*p[3]  +  p[1]*p[2]*(1-p[3])

    综上,第1个人买东西的概率= P(B)/P(A)

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,r;
    double p[20],ans[20],all;
    bool v[20];
    void dfs(int now,int sum)
    {
        if(sum==r)
        {
            double tot=1.0;
            for(int i=0;i<n;i++)
            {
                if(v[i]) tot*=p[i];
                else tot*=(1-p[i]);
            }
            all+=tot;
            for(int i=0;i<n;i++)
                if(v[i]) ans[i]+=tot;
        }
        for(int i=now+1;i<n;i++)
         {
             v[i]=1;
             dfs(i,sum+1);
             v[i]=0;
         }
    }
    int main()
    {
        int t=0;
        while(scanf("%d%d",&n,&r)!=EOF)
        {
            if(!n) return 0;
            memset(ans,0,sizeof(ans));
            all=0;
            //memset(v,0,sizeof(v));
            for(int i=0;i<n;i++) scanf("%lf",&p[i]);
            dfs(-1,0);
            printf("Case %d:
    ",++t);
            for(int i=0;i<n;i++) printf("%.6lf
    ",ans[i]/all);
        }
    }
  • 相关阅读:
    7.12函数(四)
    7.11函数(三)
    7.10函数(二)
    7.9函数(一)
    7.8文件处理补充及函数简介
    7.5字符编码及文件处理
    7.4数据类型及内置方法(二)
    Android-------- AlertDialog中EditText无法弹出输入法的解决
    Android-----输入法的显示和隐藏
    Android——ExpandableListView事件拦截
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6936579.html
Copyright © 2011-2022 走看看