[SCOI2008] 奖励关
出题人的语文真是哗了狗了。
当一个不能被你捡起的东西被抛出你不捡是没有关系的。
那就是一个很简单的DP
#include<bits/stdc++.h> #define db long double using namespace std; int n,k,val[17],x,p[17],S; db f[170][1<<15|1]; signed main () { scanf("%d%d",&n,&k); for (int i=1;i<=k;i++) { scanf("%d",val+i); while (scanf("%d",&x),x) p[i-1]|=1<<x-1; } S=1<<k; for (int i=n;i;i--) { for (int j=S-1;~j;j--) { for (int t=k-1;~t;t--) if ((p[t]&j)==p[t]) f[i][j]+=max(f[i+1][j],f[i+1][j|1<<t]+val[t+1]); else f[i][j]+=f[i+1][j]; f[i][j]/=k; } } printf("%.6Lf",f[1][0]); return 0; }