#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
double p[20];
double dp[1<<20];//dp表示当前状态到收集完所需的期望步数
int cnt[1<<20];
int main()
{
int n;
while(cin>>n)
{
double sp=0;
for(int i=0;i<n;i++){cin>>p[i];sp+=p[i];}
dp[(1<<n)-1]=0;
for(int i=(1<<n)-2;i>=0;i--)
{
double t=sp,sum=1;
for(int j=0;j<n;j++)
{
if((1<<j)&i)t-=p[j];
else sum+=p[j]*dp[i|1<<j];
}
dp[i]=sum/t;
}
printf("%.5lf\n",dp[0]);
}
return 0;
}
hdu 4336 状态压缩dp
最新推荐文章于 2020-04-08 00:02:00 发布