[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;
}

 

posted @ 2018-07-02 21:33  泪寒之雪  阅读(143)  评论(0编辑  收藏  举报