期望dp。
基本套路就是逆推一下,可以忽略不能到达的情况。因为n,K输入反,re2次。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int K,n;
double f[105][1<<15];int a[15],ned[15];
int main() {
scanf("%d%d",&K,&n);
for(int i=1,tp;i<=n;i++) {scanf("%d",&a[i]);scanf("%d",&tp);while(tp){ned[i]|=1<<(tp-1);scanf("%d",&tp);}}
for(int i=K;i;i--)
for(int j=0;j<(1<<n);j++){
for(int k=1;k<=n;k++)
if((j&ned[k])==ned[k]) f[i][j]+=max(f[i+1][j|(1<<k-1)]+a[k]*1.0,f[i+1][j]);
else f[i][j]+=f[i+1][j];f[i][j]/=n*1.0;
}
printf("%.6lf",f[1][0]);
}