首页 > 代码库 > uva 11181 Probability|Given
uva 11181 Probability|Given
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); }}
uva 11181 Probability|Given
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。