[Non]二叉苹果树

[Non]二叉苹果树

大意

给定需要保留的树枝数量,求出最多能留住多少苹
果。苹果长在树枝上。

思路

这个题目和选课最大的不同在于其需要累加的贡献在边上,因此我们依旧设 \(f_{u, j}\),则有转移方程如下:

\[f_{u, j} = \max(f_{u, j}, f_{u, j - k - 1} + f_{v, k} + w) \]

\(j - k - 1\) 的原因在于需要 \(1\) 的贡献来记 \(E \langle u, v \rangle\) 这条边,然后就没了。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
struct node {
    int v, w;
};
vector<node> g[N];

int f[N][N], n, q, a[N];

void dfs(int u, int fa) {
    for (int i = 0; i < g[u].size(); i++) {
        int v = g[u][i].v, w = g[u][i].w;
        if (v != fa) {
            dfs(v, u);
            for(int j = q;j > 0;j --){
                for(int k = 0;k < j;k ++){
                    f[u][j] = max(f[u][j], f[v][k] + w + f[u][j - k - 1]);
                }
            }
        }
    }
}
int main() {
    cin >> n >> q;
    for (int i = 1; i < n; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        g[x].push_back({y, z});
        g[y].push_back({x, z});
    }
    dfs(1, -1);
    cout << f[1][q];
    return 0;
}
posted @ 2025-12-12 22:47  To_Carpe_Diem  阅读(2)  评论(0)    收藏  举报