OJ题目:click here ~~
AC_CODE
const int inf = 1<<30;
int n , k;
int x[102];
int dp[102][102];
vector < int > List[102];
void dfs(int u , int father)
{
int i , j;
for(i = 0;i < List[u].size();i++)
{
int v = List[u][i];
if(v == father) continue;
dfs(v , u);
for(j = k;j >= 1;j--)//一定要倒序
{
for(int t = 1;t <= j;t++)
dp[u][j] = max(dp[u][j] , dp[u][t] + dp[v][j - t]);
}
}
}
int main()
{
while(cin >> n >> k)
{
int i , j , a , b;
for(i = 0;i <= n;i++) List[i].clear();
memset(dp , 0 , sizeof(dp));
for(i = 0;i < n;i++)
{
scanf("%d",&dp[i][1]);
}
for(i = 0;i < n-1;i++)
{
scanf("%d%d",&a,&b);
List[a].push_back(b);
List[b].push_back(a);
}
dfs(0 , -1);
int ans = -1;
for(i = 0;i < n;i++)
ans = max(ans , dp[i][k]);
cout << ans << endl;
}
return 0;
}