枚举,条件概率。
2^20次方等于100w,是大约可以没准还能过的。
二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),tot+=p(tot为r个人买东西的概率)
要求的就是sum[i]/tot。
P(第i个人实际买东西)=P(r个人买东西且第i个人在其中)/P(r个人买东西)。
r为0时特判
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 20 + 10; int n,r,N,cnt,kase; double a[maxn],sum[maxn]; double tot,p; int main() { kase=0; while(scanf("%d%d",&n,&r)==2) { printf("Case %d:\n",++kase); if(!n&&!r) break; for(int i=0;i<n;i++) scanf("%lf",&a[i]); if(!r) { for(int i=0;i<n;i++) printf("0.000000\n"); continue; } N=1<<n; memset(sum,0,sizeof(sum)); tot=0; for(int i=1;i<N;i++) { cnt=0; p=1; for(int j=0;j<n;j++) { if(i&(1<<j)) {cnt++; p*=a[j];} else p*=(1-a[j]); } if(cnt==r) { for(int j=0;j<n;j++) if(i&(1<<j)) sum[j]+=p; tot+=p; } } for(int i=0;i<n;i++) printf("%.6lf\n",sum[i]/tot); } return 0; }
时间: 2024-10-08 06:45:06