挺简单的。。然而还是想了一会。。。感觉自己脑袋还不是很清醒。。TAT。。。自己脑袋里老是有些奇奇怪怪的小细节。。TAT
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 40000
class node
{
public:
int cost,sum;
}dp[maxn];
class nodee
{
public:
int v,e,need;
}a[16];
int bina[16],n,total;
int vis[maxn];
void init()
{
for(int i=0;i<16;i++)
bina[i]=1<<i;
}
int max(int x,int y){return x>y?x:y;}
void work()
{
memset(vis,0,sizeof(vis));
int maxnum=1<<n;
dp[0].cost=0,dp[0].sum=0;
vis[0]=1;
for(int j=0;j<maxnum;j++)
{
for(int i=0;i<n;i++)
{
if(!vis[j]) continue;
if((j&bina[i])==0)
{
int now=j|bina[i];
if((j&a[i].need)==a[i].need)
{
if(vis[now])
{
if(a[i].e+dp[j].cost<=total)
{
if(dp[now].sum<dp[j].sum+a[i].v)
dp[now].sum=dp[j].sum+a[i].v;
else if(dp[now].sum==dp[j].sum+a[i].v)
if(a[i].e+dp[j].cost<dp[now].cost)
dp[now].cost=a[i].e+dp[j].cost;
}
}
else
if(a[i].e+dp[j].cost<=total)
{
dp[now].sum=dp[j].sum+a[i].v;
dp[now].cost=dp[j].cost+a[i].e;
vis[now]=1;
}
}
}
}
}
int ans=0;
for(int i=0;i<maxnum;i++)
if(vis[i]) ans=max(ans,dp[i].sum);
cout<<ans<<endl;
}
int main()
{
int T;
cin>>T;
init();
while(T--)
{
cin>>n>>total;
for(int i=0;i<n;i++)
{
cin>>a[i].v;
}
for(int i=0;i<n;i++)
{
cin>>a[i].e;
}
for(int i=0;i<n;i++)
{
int m,tmp=0,x;
cin>>m;
for(int j=0;j<m;j++)
{
cin>>x;
tmp+=bina[--x];
}
a[i].need=tmp;
}
work();
}
return 0;
}