ZOJ 3201 树形dp+背包(简单题)

时间:2021-02-14 15:06:07
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN = ;
vector<int>a[MAXN];
int n,m,v[MAXN],vis[MAXN],dp[MAXN][MAXN];
void dfs(int root)
{
dp[root][] = v[root];
vis[root] = ;
int i, len = a[root].size(), j, k;
int cnt = ;
for(i=; i<len; i++){
int t = a[root][i];
if(!vis[t]){
dfs(t);
for(j=m; j>; j--){
for(k=; k<j; k++){
dp[root][j] = max(dp[root][j], dp[root][j-k]+dp[t][k]);
}
}
}
}
}
int main()
{
int i,j;
while(cin>>n>>m)
{
for(i=; i<n; i++){
scanf("%d",&v[i]);
a[i].clear();
}
for(i=; i<n; i++){
int x,y;
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
}
memset(vis,,sizeof(vis));
memset(dp,,sizeof(dp)); dfs();
int ans = ;
for(i=; i<n; i++){
ans = max(ans, dp[i][m]);
}
cout<<ans<<endl;
}
}