/*************************************************************************
    > 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;
}原文:http://blog.csdn.net/acvcla/article/details/40457575