1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n, q; int dp[105][105]; // dp[i][j] 子树i保留j条边最多多少苹果 struct Edge { int v, w; }; vector<Edge> e[105]; void dfs(int u, int fa) { dp[u][0] = 0; for (int i = 0; i < e[u].size(); i++) { int v = e[u][i].v; int w = e[u][i].w; if (v == fa) continue; dfs(v, u); for (int j = q; j >= 0; j--) // u之前保留j条边 { for (int k = 0; k + j + 1 <= q; k++) // v提供多少条边 { //隐含条件:选择v下面的边时,u-v 之间的这条边包括进来了 dp[u][j + k + 1] = max(dp[u][j + k + 1], dp[u][j] + dp[v][k] + w); } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> q; for (int i = 1; i <= n - 1; i++) { int u, v, w; cin >> u >> v >> w; e[u].push_back((Edge){v, w}); e[v].push_back((Edge){u, w}); } dfs(1, 0); /* for (int i = 1; i <= n; i++) { for (int j = 0; j <= q; j++) cout << dp[i][j] << " "; cout << "\n"; } */ cout << dp[1][q] << "\n"; return 0; }
信息
- ID
- 2765
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 23
- 已通过
- 17
- 上传者