可能性dp+减少国家HDU4336
/************************************************************************* > File Name: t.cpp > Author: acvcla > Mail: acvcla@gmail.com > Created Time: 2014年10月21日 星期二 21时33分55秒 ************************************************************************/ #include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<map> #include<queue> #include<stack> #include<string> #include<cstdlib> #include<ctime> #include<set> #include<math.h> using namespace std; typedef long long LL; const int maxn = 1e5 + 10; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back double dp[1<<20],p[1<<20],A[200]; void Init(int n){ memset(p,0,sizeof p); memset(dp,0,sizeof dp); for(int i=(1<<n)-1;i>0;i--){ double t=0; for(int j=0;j<n;j++)if(1<<j&i) { p[i]+=A[j]; } } } int n; int main(int argc, char const *argv[]) { while(~scanf("%d",&n)){ double s=1; for(int i=0;i<n;i++){ scanf("%lf",A+i); s-=A[i]; } Init(n); for(int i=(1<<n)-2;i>=0;i--){ double t=0; double pi=p[i]+s; for(int j=0;j<n;j++){ if((1<<j)&i)continue; else{ int temp=i|(1<<j); t+=dp[temp]*A[j]; } } dp[i]=(t+1)/(1-pi); } printf("%.4f\n",dp[0]); } return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。