例题10-11 条件概率(Probability|Given, UVa11181)

欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

例题10-11 条件概率(Probability|Given, UVa11181)_第1张图片

题意解析

有n个人准备去超市逛,其中第i个人买东西的概率是Pi。逛完以后你得知有r个人买了东西。根据这一信息,请计算每个人实际买了东西的概率。输入 n ( 1 ≤ n ≤ 20 ) 和 r ( 0 ≤ r ≤ n ) n(1≤n≤20)和r(0≤r≤n) n1n20r0rn,输出每个人实际买了东西的概率。

算法设计

递归枚举所有可能的的n个人中哪些人买东西的情况,递归过程中用一维数组ans储存r个人买了东西,某个人就是这r个人之一的概率,用sum存储r个人买东西的总概率。用ans[i]/sum即为最终结果。

C++代码

#include
using namespace std;
double p[25],ans[25],sum=0.0;
int N,r;
vector<int>Select;//存储r个买了东西的人的编号
void DFS(int i,double pcur){
    if(i==N){//n个人枚举完成
        if(Select.size()==r){//r个人买了东西
            for(int i:Select)
                ans[i]+=pcur;
            sum+=pcur;
        }
        return;
    }
    Select.push_back(i);
    DFS(i+1,pcur*p[i]);//当前编号为i的人买了东西
    Select.pop_back();
    DFS(i+1,pcur*(1-p[i]));//当前编号为i的人没买东西
}
int main(){
    for(int ii=1;cin>>N>>r&&N!=0;++ii){
        printf("Case %d:\n",ii);
        memset(ans,0,sizeof(ans));
        sum=0.0;
        for(int i=0;i<N;++i)
            cin>>p[i];
        DFS(0,1.0);
        for(int i=0;i<N;++i)
            printf("%.6f\n",ans[i]/sum);
    }
    return 0;
}

你可能感兴趣的:(算法竞赛入门经典,-,Uva)