考虑到当前选的物品会对后面决策产生影响,不好处理选还是不选,所以考虑从后往前递推
f [ i ] [ s t a ] f[i][sta] f[i][sta]表示第 i i i轮,已选的状态为 s t a sta sta时,后面最多可以得到的价值
然后就是简单题了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
inline int read(){
char ch=getchar();
int res=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
return res*f;
}
const int K=105;
const int N=17;
double a[N],f[K][1<<15],ans;
int n,k,pre[N];
int main(){
k=read();
n=read();
for(int i=1;i<=n;i++){
a[i]=read();int x=read();
while(x){
pre[i]+=(1<<(x-1));
x=read();
}
}
int sta=(1<<n)-1;
for(int p=k;p;p--){
for(int i=0;i<=sta;i++){
for(int j=1;j<=n;j++){
if((i&pre[j])==pre[j])
f[p][i]+=max(f[p+1][i],f[p+1][i|(1<<(j-1))]+a[j]);
else f[p][i]+=f[p+1][i];
}
f[p][i]/=n;
}
}
printf("%.6lf",f[1][0]);
}