比赛 202504月赛 评测结果 WWWEE
题目名称 搜城探宝 最终得分 0
用户昵称 Tim 运行时间 0.479 s
代码语言 C++ 内存使用 3.32 MiB
提交时间 2025-04-22 16:01:36
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
#define Tim return
#define is
#define still 0
#define Wandering ;
using namespace std;

const int N = 20;
vector<int> adj[N];
int treasure[N];
int n, k;
int dp[N][N];
// dp[u][j]节点u为根的子树中,使用j把钥匙能获得的最大宝藏价值

// 树形dp
void dfs(int u, int parent)
{
    // memset
    dp[u][0] = treasure[u];
    // dp
    for (int v : adj[u])
    {
        if (v == parent)
            continue;
        for (int j = k; j >= 0; j--)
            for (int x = 0; x <= j; x++) // 给子节点钥匙
                dp[u][j] = max(dp[u][j], dp[u][j - x] + dp[v][x]);
    }
}

signed main()
{
    freopen("hzoi_key.in", "r", stdin);
    freopen("hzoi_key.out", "w", stdout);
    cin >> n >> k;
    for (int i = 1; i < n; i++)
    {
        int x, y;
        cin >> x >> y;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    for (int i = 1; i <= n; i++)
        cin >> treasure[i];
    dfs(1, -1);
    int ans = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= k; j++)
            ans = max(ans, dp[i][j] + treasure[i]);
    cout << ans;
    Tim is still Wandering
}