概率DP/数学期望/状压DP/容斥原理
kuangbin总结中的第14题
好神奇的做法……题解看kuangbin的代码好了……
1 //HDOJ 4336 2 #include<cstdio> 3 #define rep(i,n) for(int i=0;i<n;++i) 4 #define F(i,j,n) for(int i=j;i<=n;++i) 5 #define D(i,j,n) for(int i=j;i>=n;--i) 6 const int N=22; 7 8 double p[N],f[1<<N]; 9 int main(){ 10 int n; 11 while(scanf("%d",&n)!=EOF){ 12 double tt=0.0; 13 rep(i,n){ 14 scanf("%lf",&p[i]); 15 tt+=p[i]; 16 } 17 tt=1-tt; 18 f[(1<<n)-1]=0; 19 D(i,(1<<n)-2,0){ 20 double x=0,sum=1.0; 21 rep(j,n) 22 if(i & (1<<j))x+=p[j]; 23 else sum+=p[j]*f[i|(1<<j)]; 24 f[i]=sum/(1-tt-x); 25 } 26 printf("%.5lf ",f[0]); 27 } 28 return 0; 29 }
1 //HDOJ 4336 2 #include<cstdio> 3 #define rep(i,n) for(int i=0;i<n;++i) 4 #define F(i,j,n) for(int i=j;i<=n;++i) 5 6 double p[22]; 7 int main(){ 8 int n; 9 while(scanf("%d",&n)!=EOF){ 10 rep(i,n) scanf("%lf",&p[i]); 11 double ans=0; 12 for(int i=1;i<(1<<n);++i){ 13 int cnt=0; double sum=0; 14 rep(j,n) if(i&(1<<j)){ 15 sum+=p[j]; 16 cnt++; 17 } 18 if (cnt&1) ans+=1.0/sum; 19 else ans-=1.0/sum; 20 } 21 printf("%.5lf ",ans); 22 } 23 return 0; 24 }