记录编号 600745 评测结果 AAAAAAAAAA
题目名称 外卖 最终得分 100
用户昵称 GravatarXZDZD 是否通过 通过
代码语言 C++ 运行时间 0.061 s
提交时间 2025-05-13 15:48:03 内存使用 4.54 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
const int N = 600;
using namespace std;
int n, m;
int ans;
int v[N];
int sz[N];
int f[N][N][3];
vector <int> G[N];
void dp (int u, int fa) {
    sz[u] = 1;f[u][1][0] = v[u];f[u][1][1] = v[u];
	for (auto v1 : G[u]) {
		if (v1 == fa) continue;
        dp(v1, u);
        sz[u] += sz[v1];
        for (int i = min (m, 3 * sz[u]); i; --i) {
            for (int j = 1; j < min(i, 3 * sz[v1]); ++j) {
                if (i - j - 2 >= 0) {
                    f[u][i][1] = max(f[u][i][1], f[v1][j][1] + f[u][i - j - 2][1]);
                    f[u][i][0] = max(f[u][i][0], f[v1][j][1] + f[u][i - j - 2][0]);                                       
                }
                    f[u][i][0] = max(f[u][i][0], f[v1][j][0] + f[u][i - j - 1][1]); 
            }
        }
	}
}
signed main() {
    freopen("food.in","r",stdin);
    freopen("food.out","w",stdout);

	cin >> n >> m;

	for (int i = 1;i <= n; ++i) cin >> v[i];

	for (int i = 1; i < n; ++i) {
		int u, v; cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
    dp(1, 0);
    for (int i = 1; i <= 521; ++i) ans = max ({ans,f[1][i][1],f[1][i][0]});
    cout << ans;
	return 0;
}