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;
}
//求在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;
}
相关文章推荐
- UVA - 11181 Probability|Given (dfs处理条件概率)
- UVa 11181 (条件概率) Probability|Given
- UVA 11181(C) ——Probability|Given (条件概率, dfs求组合)
- Uva - 11181 Probability|Given (条件概率)
- UVa 11181 - Probability|Given (条件概率)
- UVA - 11181 Probability|Given(条件概率+dfs枚举组合)
- 【UVA】11181 - Probability|Given(条件概率)
- UVA 11181 Probability|Given (离散概率)
- UVA 11181 - Probability|Given (概率DFS)
- UVA - 11181 Probability|Given 概率 + 递归枚举子集
- uva 11181 - Probability|Given(概率)
- UVA.11181 Probability|Given (概率)
- uva 11181 - Probability|Given(概率)
- Uva 11181 Probability|Given(概率dp)
- UVA 11181 Probability|Given 概率
- Probability|Given - UVa 11181 概率dp
- UVa 11181 - Probability|Given 概率
- UVA-11181 Probability|Given(概率)
- uva 11181 - Probability|Given
- UVa11181 - Probability|Given(条件概率)