hdu 4336 容斥原理

来源:互联网 发布:subversion mac 编辑:程序博客网 时间:2024/05/16 14:34
 按照解题报告的提示,用容斥原理实现

 

#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;double gl[50],ans;int n;void solve(int bg,double sum,int flag,double &ans){ans+=flag/sum;for(int j=bg+1;j<n;j++)solve(j,sum+gl[j],-1*flag,ans);return;}int main(){int i,j,k;while(~scanf("%d",&n)){for(i=0;i<n;i++)scanf("%lf",&gl[i]);ans=0;for(i=0;i<n;i++){solve(i,gl[i],1,ans);}printf("%f\n",ans);}return 0;}

另解:概率dp,康哥指导的

#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;double f[1<<21],gl[22];int main(){int i,j,k,n;double fz,fm;while(~scanf("%d",&n)){for(i=0;i<n;i++)scanf("%lf",&gl[i]);f[(1<<n)-1]=0;for(i=(1<<n)-2;i>=0;i--){fz=1;fm=0;for(k=0;k<n;k++){if((i>>k&1)==0){fz+=gl[k]*f[i|(1<<k)];fm+=gl[k];}}//printf("^ %f %f\n",fz,fm);f[i]=fz/fm;}printf("%f\n",f[0]);}return 0;}