1 0.1 2 0.1 0.4
10.000 10.500
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b) for(i = a; i <b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 21
double dp[1<<N];
double p[N];
int n;
int main()
{
int i,j;
while(~sf(n))
{
mem(dp,0);
double te=0;
for(i=0;i<n;i++)
{
scanf("%lf",&p[i]);
te+=p[i];
}
te=1-te;
int len=1<<n;
for(i=len-2;i>=0;i--)
{
double x=0;
double s=1;
for(j=0;j<n;j++)
{
if(i&(1<<j)) x+=p[j];
else
s+=p[j]*dp[i|(1<<j)];
}
dp[i]=s/(1-x-te);
}
pf("%.4f\n",dp[0]);
}
return 0;
}
HDU 4336 Card Collector(概率dp+状压)
原文:http://blog.csdn.net/u014737310/article/details/45203317