Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1405 Accepted Submission(s): 624
Special Judge
/* HDU 4336 题意: 有N(1<=N<=20)张卡片,每包中含有这些卡片的概率为p1,p2,````pN. 每包至多一张卡片,可能没有卡片。 求需要买多少包才能拿到所以的N张卡片,求次数的期望。 可以用容斥原理做。也可以状态压缩进行概率DP 期望DP */ #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> using namespace std; const int MAXN=22; double p[MAXN]; double dp[1<<MAXN]; int main() { int n; while(scanf("%d",&n)!=EOF) { double tt=0; for(int i=0;i<n;i++) { scanf("%lf",&p[i]); tt+=p[i]; } tt=1-tt;//tt就表示没有卡片的概率了 dp[(1<<n)-1]=0; for(int i=(1<<n)-2;i>=0;i--) { double x=0,sum=1; for(int j=0;j<n;j++) { if((i&(1<<j)))x+=p[j]; else sum+=p[j]*dp[i|(1<<j)]; } dp[i]=sum/(1-tt-x); } printf("%.5lf\n",dp[0]); } return 0; }
/* HDU 4336 容斥原理 位元素枚举 */ #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; double p[22]; int main() { int n; while(scanf("%d",&n)==1) { for(int i=0;i<n;i++)scanf("%lf",&p[i]); double ans=0; for(int i=1;i<(1<<n);i++) { int cnt=0; double sum=0; for(int j=0;j<n;j++) if(i&(1<<j)) { sum+=p[j]; cnt++; } if(cnt&1)ans+=1.0/sum; else ans-=1.0/sum; } printf("%.5lf\n",ans); } return 0; }