Tree [] P1273 cable television network packet backpack

 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 }
View Code

 

Guess you like

Origin www.cnblogs.com/thjkhdf12/p/11641146.html