uva 11181 Probability|Given

本文介绍了一个购物概率计算问题:已知n个人中r个人购物的情况,求每个人实际购物的概率。通过定义事件A为n个人中有r个人购物,事件B为某个人购物,利用条件概率公式进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:\n",++t);
        for(int i=0;i<n;i++) printf("%.6lf\n",ans[i]/all);
    }
}

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6936579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值