UVa11181 - Probability|Given(离散条件概率)

分析:

“r个人买了东西”这个时间叫E,"第i个人买东西"这个时间叫Ei,则要求的是条件概率P(Ei|E).

根据条件概率公式,P(Ei|E)=P(EiE)/P(E)

P(E)依然可用全概率公式,例如,n=4,r=2有6中可能:1100,1010,1001,0110,0101,0011,其中1100的概率为P1*P2*(1-P3)*(1-P4),其他类似,设置A【k】表示第k个人是否买东西,(1表示买,0表示不买),则可用递归方法枚举恰好r个A[k]=1的情况。

如何计算P(EiE)呢,方法一样,只有枚举的时候要保证第A[i]=1,不难发现,其实可以用一次枚举就计算出所有的值,用tot表示上述概率之和,sum【i】表示A[i]的概率之和,则答案P(Ei)/P(E)=sum[i]/tot;

直接根据条件概率的定义来

P(A|B) = P(AB)/P(B)

在这道题中B就是r个人买了东西

A就是某个人买了东西

然后考虑所有情况的概率,累加起来求的各个事件的概率

开始枚举所有的组合都不会写了,后来想想就是用类似dp的思想,dfs实现

#include<cstdio>

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

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

int main()
{
    int t=0;
    while(scanf("%d%d",&n,&r)){
        if(n==0&&r==0)
            break;
        t++;
        printf("Case %d:\n",t);
        for(int i=0;i<25;i++){
            ans[i]=0;
            vis[i]=0;
        }
        for(int i=1;i<=n;i++)
            scanf("%lf",&p[i]);
        dfs(0,0);
        for(int i=1;i<=n;i++)
            printf("%.6lf\n",ans[i]/ans[0]);
    }
    return 0;
}
时间: 2024-10-13 11:28:03

UVa11181 - Probability|Given(离散条件概率)的相关文章

【UVA】11181 - Probability|Given(条件概率)

一道条件概率题,数学烂真的伤不起,一开始都不知道怎么求条件概率. P(e) = p(e|E)/p(E). 用e出现的情况的概率,除以所有情况出现的概率,递归枚举每个人是否买东西了. 14026058 11181 Probability|Given Accepted C++ 0.102 2014-08-12 08:25:51 效率可能有点差. #include<cstdio> #include<cstring> #include<iostream> #include<

UVA 11181 Probability|Given 数学 条件概率

题目链接: https://vjudge.net/problem/UVA-11181 题目描述: 有n个人, 已知每个人买东西的概率, 现在n个人中一共有r个人买了东西, 问每个人实际买东西的概率是多少 解题思路: 一开始我设Xi为第i个人实际买东西的概率, X1 + X2 + ...... + Xn == r, 又已知P1*X1 + P2*X2 + ...... + Pn*Xn == 1 求每一个Xi, 我又犯蠢了, 我竟然想这样求出来每一个Xi......如果这道题Xi为已知求Pi就能求了,

UVA - 11181 Probability|Given (条件概率)

题意:有n个人,已知每个人买东西的概率,求在已知r个人买了东西的条件下每个人买东西的概率. 分析:二进制枚举个数为r的子集,按定义求即可. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<sstream> #include<iterator

UVA11181 - Probability|Given(概率)

题目链接 题目大意:n个人去购物,要求只有k个人买东西.给你n个人每个人买东西的概率,然后要你求出这n个人中有k个人购物并且其中一个人是ni的概率pi. 解题思路:设B是n个人中选择k个人.设Ai是除了第i个人外选择k - 1个人.那么P = P(Ai)? pi / P(B);所以用dfs求出B,和Ai的概率,然后代入公式得到最后的结果. 代码: #include <cstdio> #include <cstring> const int maxn = 25; int N, K;

「UVA11181」 Probability|Given(概率

题意翻译 有n个人要去买东西,他们去买东西的概率为p[i]. 现在得知有r个人买了东西,在这种条件下,求每个人买东西的概率. 感谢@s_r_f 提供翻译 题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 3 2 0.10 0.20 0.30 5 1 0.10 0.10 0.10 0.10 0.10 0 0 输出样例#1: 复制 Case 1: 0.413043 0.739130 0.847826 Case 2: 0.200000 0.200000 0.2

《算法竞赛入门经典——训练指南》第二章题库

UVa特别题库 UVa网站专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=442 注意,下面注有"extra"的习题并没有在书中出现,但在上面的特别题库中有,属于附加习题. 基础练习 (Basic Problems) UVa11388 GCD LCM UVa11889 Benefit UVa10943 How do y

数学基础笔记

离散型变量和概率质量函数(probability mass function, PMF)将随机变量能够取得的每个状态映射到随机变量取得该状态的概率 多个变量的概率分布被称为联合概率分布(joint probability distribution) 连续型变量和概率密度函数(probability density function, PDF) 边缘概率边缘概率分布(marginal probability distribution) 条件概率条件概率的链式法则任何多维随机变量的联合概率分布,都可

概率论与数理统计常用英文词汇对照

Probability Theory 概率论 Trial 试验 intersection交 union 并 frequency 频率 difference 差 additivity 可加性complementation 对立 contain 包含 equivalent 等价 mean 均值 convolution [,k?nv?'lu:??n] 卷积variance 方差 covariance 协方差 correlated 相关 standard deviation 标准差Random expe

UVa 11181 Probability|Given (条件概率 &amp; 深度优先搜索)

题目 题目大意 有\(n\)个人准备去超市逛, 其中第\(i\)个人买东西的概率是\(P_i\).逛完以后你得知有\(r\)个人买了东西.根据这一信息, 请计算出每个人实际买了东西的概率.输入\(n\)(\(1 ≤ n ≤ 20\))和 \(r\)(\(0 ≤ r ≤ n\)), 输出每个人实际买了东西的概率. 题解 用DFS枚举每一种可能的情况, sum[n]表示总概率, sum[i]表示第\(i\)个人买了东西的概率之和, 则答案为sum[i]/sum[n]. 代码 #include <cs