UVA - 11181
题意:
n个人去买东西,其中第i个人买东西的概率是p[i],最后只有r个人买了东西,求每个人实际买了东西的概率
代码:
//在r个人买东西的概率下每个人买了东西的概率,这是条件概率,因为最多20个人可以枚举所有的状态 //然后找到所有的r个人买东西的状态,算出总的概率,某个人在此条件下的概率就是这个人参与了的状态 //的概率和除以总概率。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int sta[1<<21],n,r,nu; double p[22],sum[22]; void init(){int N=(1<<n);nu=0;for(int i=0;i<N;i++){int t=i,cnt=0;while(t){cnt+=(t&1);t>>=1;}if(cnt==r) sta[++nu]=i;} } int main() {int cas=0;while(scanf("%d%d",&n,&r)==2&&(n+r)){for(int i=1;i<=n;i++)scanf("%lf",&p[i]);init();memset(sum,0,sizeof(sum));double tot=0;for(int i=1;i<=nu;i++){int x=sta[i];double tmp=1.0;for(int j=1;j<=n;j++){if(x&(1<<(j-1))) tmp*=p[j];else tmp*=(1-p[j]);}tot+=tmp;for(int j=1;j<=n;j++)if(x&(1<<(j-1))) sum[j]+=tmp;}printf("Case %d:\n",++cas);for(int i=1;i<=n;i++)printf("%.6lf\n",sum[i]/tot);}return 0; }