1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 6 struct node 7 { 8 int to, w, nxt; 9 node() {}; 10 node(int a, int b, int c) 11 { 12 to = a; 13 w = b; 14 nxt = c; 15 } 16 }; 17 18 node g[3001]; 19 int s[3001]; 20 int cnt; 21 int u[3001]; 22 int n, m; 23 int dp[3001][3001]; 24 25 void add(int f, int t, int w) 26 { 27 g[++cnt] = node(t, w, s[f]); 28 s[f] = cnt; 29 } 30 31 int dfs(int t) 32 { 33 if (t > n - m) 34 { 35 dp[t][1] = u[t]; 36 dp[t][0] = 0; 37 return 1; 38 } 39 dp[t][0] = 0; 40 int sum = 0; 41 for (int i = s[t]; i > 0; i = g[i].nxt) 42 { 43 int v = g[i].to; 44 int w = g[i].w; 45 int num = dfs(v); 46 sum += num; 47 for (int j = sum; j > 0; j--) 48 { 49 for (int k = 0; k <= min(j, num); k++) 50 dp[t][j] = max(dp[t][j], dp[t][j - k] + dp[v][k] - w); 51 } 52 } 53 return sum; 54 } 55 56 int main() 57 { 58 //cout<<0x8f<<endl; 59 cin >> n >> m; 60 for (int i = 1; i <= n - m; i++) 61 { 62 int num; 63 cin >> num; 64 for (int j = 0; j < num; j++) 65 { 66 int v, nxt; 67 cin >> v >> nxt; 68 add(i, v, nxt); 69 } 70 } 71 for (int i = n - m + 1; i <= n; i++) 72 cin >> u[i]; 73 memset(dp, 0x8f, sizeof(dp)); 74 memset(dp, 0, sizeof(dp[0])); 75 dfs(1); 76 for (int i = m; i >= 0; i--) 77 { 78 if (dp[1][i] >= 0) 79 { 80 cout << i << endl; 81 break; 82 } 83 } 84 }