【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<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF (1 << 10)
#define esp 1e-6
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 20 + 5
int n,m;
double p[MAXD];
double Sum ;
double _sum[MAXD];
int vis[MAXD];
bool Input(){
    scanf("%d%d",&n,&m);
    if(!n && !m)
        return false;
    for(int i = 0 ; i < n ; i++)
        scanf("%lf",&p[i]);
    return true;
}
void dfs(int cur, int key ,int now,double value){
    if(key == 1){  /*这个人买东西了*/
        value = value * p[cur];
        vis[cur] = 1;  /*表示这个人买东西了*/
    }
    else{
        value = value * (1 - p[cur]);
        vis[cur] = 0;
    }
    if(cur == n - 1){
        if(now == m){
        Sum += value;
        for(int i = 0 ; i < n ; i++)
            if(vis[i])
                _sum[i] += value;
        }
        return ;
    }
    if(now < m)
    dfs(cur + 1, 1 , now + 1 , value); /*假设下一个人买东西了*/
    dfs(cur + 1, 0 , now , value);     /*假设下一个人没买东西*/
    return ;
}
int main(){
    int Case = 1;
    while(Input()){
        Sum = 0;
        memset(_sum,0,sizeof(_sum));
        memset(vis,0,sizeof(vis));
        dfs(0,0,0,1);
        dfs(0,1,1,1);
        printf("Case %d:\n",Case ++);
        for(int i = 0 ; i < n ; i++){
            double ans  =  _sum[i] / Sum;
            printf("%.6f\n",ans);
        }
    }
    return 0;
}

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

时间: 2024-12-28 00:26:47

【UVA】11181 - Probability|Given(条件概率)的相关文章

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

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

设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西. 那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同时总状态并不多,因此我们可以枚举买东西的状态预处理出P(AiB)和P(B),再代入计算即可. 枚举就是一般的dfs,关键是明白这个过程. 1 #include <cstdio> 2 #include <cstring> 3 int n,r; 4 double p[25],b[25],s

uva 11181 - Probability|Given

条件概率公式:P( A|B ) = P( AB ) / P( B ) 表示在事件B发生的前提下,事件A发生的概率: 对本道题: 设事件E:r个人买了东西: 事件Ei:第i个人买了东西: 则要求的是P( Ei | E ); 计算P( E ) 用全概率公式即可,采用递归枚举出所有r个人买东西的情况,然后计算出其总的概率: 计算P( Ei ) 就是在上面递归枚举的过程中将选上第i个人的情况的概率加起来:(在这种情况下,其概率就是:在E发生的前提下的概率) 代码: #include<cstdio> #

概率论 --- Uva 11181 Probability|Given

Uva 11181 Probability|Given Problem's Link:   http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18546 Mean: n个人去逛超市,第i个人会购买东西的概率是Pi.出超市以后发现有r个人买了东西,问你每个人购买东西的实际概率是多少. analyse: 转换模型: 有n个员工,每个员工被选出来的概率是Pi.最后选出了r个,问你第i个员工在这r个中的概率是多少. 设: 事件A---

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

Uva 11181 Probability|Given(概率dp)

Problem G Probability|Given Input: Standard Input Output: Standard Output N friends go to the local super market together. The probability of their buying something from the market is respectively. After their marketing is finished you are given the

UVA 11346 - Probability(概率)

UVA 11346 - Probability 题目链接 题意:给定a,b,s要求在[-a,a]选定x,在[-b,b]选定y,使得(0, 0)和(x, y)组成的矩形面积大于s,求概率 思路:这样其实就是求xy > s的概率,那么画出图形,只要求y = s / x的原函数, y = slnx,带入两点相减就能求出面积,面积比去总面积就是概率 代码: #include <cstdio> #include <cstring> #include <cmath> int

uva 11346 - Probability(可能性)

题目链接:uva 11346 - Probability 题目大意:给定x,y的范围.以及s,问说在该范围内选取一点,和x,y轴形成图形的面积大于s的概率. 解题思路:首先达到方程xy ≥ s.即y = s / x. S2的面积用积分计算,y = s / x的原函数为lnx 所以S2=s?(ln(a)?ln(x)) #include <cstdio> #include <cstring> #include <cmath> #include <algorithm&g