解:用状压dp[0]=p1*dp[1]+p2*dp[2]+p3*dp[4]...+(1-p1..)dp[0]+1;
...
/*
用递推形式312ms
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define eps 1e-10
#define N 20
double f[N];
int n;
double dp[1<<N];
int main(){
int i,j;
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++)
scanf("%lf",&f[i]);
memset(dp,0,sizeof(dp));
dp[(1<<n)-1]=0;
for(i=(1<<n)-2;i>=0;i--) {
double tot=0;
for(j=0;j<n;j++) {
if((1<<j)&i)continue;
dp[i]+=dp[i|(1<<j)]*f[j];
tot+=f[j];
}
dp[i]=(dp[i]+1)/tot;
}
printf("%lf\n",dp[0]);
}
return 0;}
/*
用记忆化搜索998ms,勉强过,囧
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define eps 1e-10
#define N 20
double f[N];
int n;
double dp[1<<N];
double dfs(int k) {
if(dp[k]>eps||fabs(dp[k])<=eps)return dp[k];
int i;
double sum=0,tot=0;
for(i=0;i<n;i++) {
if((1<<i)&k)
continue;
tot+=dfs((1<<i)|k)*f[i];
sum+=f[i];
}
return dp[k]=(tot+1)/sum;
}
int main(){
int i;
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++)
scanf("%lf",&f[i]);
memset(dp,-1,sizeof(dp));
dp[(1<<n)-1]=0;
printf("%lf\n",dfs(0));
}
return 0;}