1 #include "bits/stdc++.h" 2 using namespace std; 3 int T; 4 5 int dp[40000]; 6 int totene[40000]; 7 8 int N, E; 9 int val[20], ene[20], cond[20]; 10 11 const int INF = 0x3f3f3f3f; 12 13 int main() 14 { 15 scanf("%d", &T); 16 while(T--) { 17 memset(cond, 0, sizeof(cond)); 18 memset(dp, 0xf3, sizeof(dp)); 19 dp[0] = 0; 20 scanf("%d%d", &N, &E); 21 int res = 0; 22 int i; 23 for(i = 1; i <= N; ++i) { 24 scanf("%d", &val[i]); 25 } 26 for(i = 1; i <= N; ++i) { 27 scanf("%d", &ene[i]); 28 } 29 int M, item; 30 for(i = 1; i <= N; ++i) { 31 scanf("%d", &M); 32 while(M--) { 33 scanf("%d", &item); 34 cond[i] |= (1 << (item - 1)); 35 } 36 } 37 int tot_s = (1 << N) - 1; 38 int s, step_s, pre_s; 39 for(s = 1; s <= tot_s; ++s) { 40 for(item = 1; item <= N; ++item) { 41 42 step_s = (1 << (item - 1)); 43 pre_s = s ^ step_s; 44 if(dp[pre_s] < 0) { 45 continue; 46 } 47 48 if((step_s & s) && ((pre_s & cond[item]) == cond[item])) { 49 // if(dp[s] == INF) { 50 totene[s] = totene[pre_s] + ene[item]; 51 // } 52 dp[s] = max(dp[s], dp[pre_s] + val[item]); 53 if(totene[s] <= E) { 54 res = max(res, dp[s]); 55 } 56 break; 57 } 58 } 59 } 60 printf("%d\n", res); 61 } 62 } 63 64 65 //4 66 //4 4 67 //1 1 1 1 68 //1 1 1 1 69 //0 70 //1 1 71 //2 1 2 72 //3 1 2 3 73 74 //4 75 //4 4 76 //1 1 1 1 77 //1 1 1 1 78 //1 2 79 //1 1 80 //2 1 2 81 //3 1 2 3
时间: 2024-10-06 11:57:01