题意:
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; }