UVa 11181 条件概率

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

题意:

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

思路:

"r个人买了东西"这个事件叫E,"第i个人买东西"这个事件为Ei,则要求的是条件概率

P(E)的话我们可以用全概率公式计算出来,把每一种情况都枚举出来,比如1100出现的概率就是,之后再计算一个P(Ei | E)即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6
 7 const int maxn=20+5;
 8
 9 int n,r;
10 double p[maxn];
11 double ans[maxn];
12 int vis[maxn];
13
14 void dfs(int k,int cur)
15 {
16     if(cur==r)
17     {
18         double temp=1;
19         for(int i=1;i<=n;i++)
20         {
21             if(vis[i])  temp*=p[i];
22             else temp*=(1-p[i]);
23         }
24         ans[0]+=temp;
25         for(int i=1;i<=n;i++)
26             if(vis[i])
27             ans[i]+=temp;
28     }
29     else
30     {
31         for(int i=k;i<=n;i++)
32         {
33             vis[i]=1;
34             dfs(i+1,cur+1);
35             vis[i]=0;
36         }
37     }
38 }
39
40 int main()
41 {
42     //freopen("D:\\input.txt","r",stdin);
43     int kase=0;
44     while(~scanf("%d%d",&n,&r))
45     {
46         if(n==0 && r==0)  break;
47         memset(ans,0,sizeof(ans));
48         memset(vis,0,sizeof(vis));
49         for(int i=1;i<=n;i++)
50             scanf("%lf",&p[i]);
51         dfs(1,0);
52         printf("Case %d:\n",++kase);
53         for(int i=1;i<=n;i++)
54             printf("%.6lf\n",ans[i]/ans[0]);
55     }
56     return 0;
57 }
时间: 2024-08-09 23:23:07

UVa 11181 条件概率的相关文章

集训第六周 数学概念与方法 UVA 11181 条件概率

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18546 题意:有n个人会去超市,其中只有r个人会买东西,每个人独自买东西的概率会给出,问这一群人去买东西,第i个人属于r之中的概率是多少 思路:首先得了解什么是条件概率. 条件概率:事件A在事件B成立的基础上再成立的概率,公式为:P(A|B)=P(A*B)/P(B) 可以照着题目案例1进行分析: 输入 0.10 0.20 0.30 输出 0.413043 0.739130

UVa 11181 (条件概率) Probability|Given

题意: 有n个人买东西,第i个人买东西的概率为Pi.已知最终有r个人买了东西,求每个人买东西的概率. 分析: 设事件E为r个人买了东西,事件Ei为第i个人买了东西.所求为P(Ei|E) = P(EiE) / P(E) 用一个buy数组记录每个人买或没买东西,然后dfs. 枚举所有r个人买了东西的情况的概率prob,累加到sum[n]中,对于buy[i] == true,再将prob加到sum[i]中. 最后答案为sum[i] / sum[n] 1 #include <cstdio> 2 #in

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

直接枚举计算就行: #include<cstdio> #include<cstring> #include<algorithm> #define maxn 22 using namespace std; double ans[maxn],p[maxn]; bool vis[maxn]; int n,r; void dfs(int cur,int cot) { if(cur>n) { if(cot==r) { double tmp=1; for(int i=1; i

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 (条件概率)

设事件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 (条件概率 &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