题目描述
传送门
题意:有n种卡片,一个包里会包含至多一张卡片,第i种卡片在某个包中出现的次数为pi,问将所有种类的卡片集齐需要买的包的期望。
注意存在某个包中一张也没有。
题解
f(i)表示得到的人物状态为i时的期望
然后枚举下一个状态,计算概率并转移
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
double p[25],f[1<<21];
void clear()
{
memset(p,0,sizeof(p));
memset(f,0,sizeof(f));
}
int main()
{
while (~scanf("%d",&n))
{
clear();
for (int i=1;i<=n;++i) scanf("%lf",&p[i]),p[0]+=p[i];
p[0]=1.0-p[0];
f[(1<<n)-1]=0;
for (int i=(1<<n)-2;i>=0;--i)
{
double P=p[0];
for (int j=0;j<n;++j)
if ((i>>j)&1) P+=p[j+1];
else
{
int state=i|(1<<j);
f[i]+=(f[state]+1.0)*p[j+1];
}
f[i]=(f[i]+P)/(1.0-P);
}
printf("%.4lf\n",f[0]);
}
}