1. 程式人生 > >hihoCoder week12 刷油漆

hihoCoder week12 刷油漆

題目連結: https://hihocoder.com/contest/hiho12/problem/1

給出一棵樹 每個節點的價值

求以1為根的樹中,選取m個相聯通的節點的最大價值和

#include <bits/stdc++.h>
using namespace std;

const int N = 110;
int n, m, V[N];
int dp[N][N]; // 以i為根 個數為m的最大價值
bool vis[N];
vector<int> G[N];

void dfs(int u)
{
    vis[u] = true;
    memset(dp[u], 
0, sizeof(dp[u])); dp[u][1] = V[u-1]; for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(vis[v]) continue; dfs(v); for(int j=m; j>1; j--) { for(int k=1; k<j; k++) { dp[u][j] = max(dp[u][j], dp[u][j-k] + dp[v][k]); } } } }
int main() { scanf("%d %d", &n, &m); for(int i=0; i<n; i++) scanf("%d", &V[i]); for(int i=1; i<n; i++) { int u, v; scanf("%d %d", &u, &v); G[v].push_back(u); G[u].push_back(v); } memset(vis, 0, sizeof(vis)); dfs(
1); printf("%d\n", dp[1][m]); return 0; }