测试地址:Card Collector
题目大意:要收集
做法:本题需要用到状态压缩DP和期望DP。
首先,我们发现
其中后继状态指
以下是本人代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
double p[25],f[2000010];
bool vis[2000010];
double dp(int x)
{
if (vis[x]) return f[x];
if (x==(1<<n)-1) return 0;
f[x]=0;
double P=0.0;
for(int i=1;i<=n;i++)
if (!(x&(1<<(i-1))))
{
P+=p[i];
f[x]+=p[i]*dp(x+(1<<(i-1)));
}
f[x]=(f[x]+1)/P;
vis[x]=1;
return f[x];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%lf",&p[i]);
printf("%lf
",dp(0));
}
return 0;
}