概率论 --- 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----第i个员工在这r个员工中。

事件B----从n中选出r个员工。

那么我们只需计算出所有B事件的概率相加为sum1,所有A事件的概率相加为sum2,答案就是sum2/sum1;

也就是求在B事件发生的情况下,A事件发生的概率。

数据很小,直接用bfs枚举暴力所有的组合数就行。

Time complexity: O(n^2)

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-05-17-21.37
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL long long
#define  ULL unsigned long long
using namespace std;

int n,k;
double p[25],ans[25];
bool vis[25];
void dfs(int N,int K)
{
        if(!K)
        {
                double tmp=1;
                for(int i=1;i<=n;++i)
                        if(vis[i]) tmp*=p[i];
                        else tmp*=(1-p[i]);
                ans[0]+=tmp;
                for(int i=1;i<=n;++i)
                        if(vis[i]) ans[i]+=tmp;
        }
        else
        {
                for(int i=N;i<=n;++i)
                {
                        vis[i]=1;
                        dfs(i+1,K-1);
                        vis[i]=0;
                }
        }
}

int main()
{
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        int Cas=1;
        while(cin>>n>>k,n+k)
        {
                for(int i=1;i<=n;++i) cin>>p[i];
                memset(vis,0,sizeof vis);
                memset(ans,0,sizeof ans);
                dfs(1,k);
                printf("Case %d:\n",Cas++);
                for(int i=1;i<=n;++i)
                {
                        printf("%.6lf\n",ans[i]/ans[0]);
                }
        }
        return 0;
}
/*

*/

时间: 2024-10-13 14:24:09

概率论 --- Uva 11181 Probability|Given的相关文章

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

题意:有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 数学 条件概率

题目链接: 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(条件概率)

一道条件概率题,数学烂真的伤不起,一开始都不知道怎么求条件概率. 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 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