状压DP
转移模式像极了POI2007ATR
还是读进来预处理可达性状态模式。
然后倒着跑(因为这是期望状压)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double f[1<<16][51]={0};
int a[20]={0};
int w[20]={0};
int p[20]={0};
int k,n;
int main(){
scanf("%d%d",&k,&n);
w[0]=1;
for(int i=1;i<=16;i++){
w[i]=w[i-1]<<1;
}
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
int x;
while(scanf("%d",&x)){
if(x==0){
break;
}
a[i]+=w[x-1];
}
}
int towards=w[n]-1;
for(int i=k;i>=1;i--){
for(int j=0;j<=towards;j++){
for(int ii=1;ii<=n;ii++){
if((a[ii]&j)==a[ii]){
f[j][i]+=max(f[j][i+1],f[j|w[ii-1]][i+1]+p[ii]);
}
else{
f[j][i]+=f[j][i+1];
}
}
f[j][i]/=(double)n;
}
}
printf("%.6lf",f[0][1]);
}