您的位置:首页 > 其它

uva 11181 Probability|Given 条件概率

2016-10-19 11:06 417 查看
点击打开链接

//求在r个人买东西的情况下 第i个人买东西的概率

//p(Ei|E)=p(EiE)/p(E) 


//枚举r个人买东西的情况 利用全概率 算出P(E) 


//n=4 r=2例如P(E2E)=P(1100)+P(0110)+P(0101) 

//P(EiE) 画个维恩图就知道了->P(EiE)为状态不同E中a[i]=1的累加和 

//即全概率中对E进行划分-> P(EiE)=累加和P(EiEk) k为E的某个划分 


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
const int N=1e2+20;
int n,r;
double pro
;//i'th person's buying probability
double ans
;//在r个人买东西的条件下 第i个人买东西的概率
int a
;//a[i] 第i个人是否买东西
double pe; //r个人买东西概率
void cal()
{
double res=1;
for(int i=1;i<=n;i++)
{
if(a[i])
{
res*=pro[i];
}
else
res*=(1-pro[i]);
}
for(int i=1;i<=n;i++)
{
if(a[i])
ans[i]+=res;
//n=4 r=2例如P(E2E)=P(1100)+P(0110)+P(0101)
//P(EiE) 画个维恩图就知道了->P(EiE)为状态不同E中a[i]=1的累加和
//即全概率中对E进行划分-> P(EiE)=累加和P(EiEk) k为E的某个划分
}
pe+=res;
}
void dfs(int cur,int num)//枚举r的状态
{
if(num==r)
{
cal();
return;
}
if(cur>n)
return;

a[cur]=1;
dfs(cur+1,num+1);
a[cur]=0;
dfs(cur+1,num);
}
int main()
{

int cas=0;
while(cin>>n>>r&&(n+r))
{
pe=0;
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
//求在r个人买东西的情况下 第i个人买东西的概率
//p(Ei|E)=p(EiE)/p(E)
for(int i=1;i<=n;i++)
cin>>pro[i];

dfs(1,0);//枚举r个人买东西的情况 利用全概率 算出P(E)
printf("Case %d:\n",++cas);
for(int i=1;i<=n;i++)
printf("%lf\n",ans[i]/pe);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: