http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3326
//1858391 2009-05-07 14:27:05 Accepted 3201 C++ 0 228 aslys
#include<iostream>
#include<vector>
using namespace std;
const int N = 105;
int n,k;
int f[N][N],w[N];
vector<int>sum[N];
//学习使用vector
void dp(int x,int y)
  {
int i,j,temp[N];
memset(temp,0,sizeof(temp));
for(i=1;i<=k;i++)
 {
for(j=1;j<=i;j++)
if(f[x][j] + f[y][i-j] > temp[i])//合并出最大的
temp[i] = f[x][j] + f[y][i-j];
}
for(i=1;i<=k;i++)
if(f[x][i] < temp[i])
f[x][i] = temp[i];
}

void dfs(int now,int pre)
  {
int len = sum[now].size();
int i,cnt = 0;
for(i=0;i<len;i++)
 {
if(sum[now][i] != pre)
 {
dfs(sum[now][i],now);
f[now][1] = w[now];
dp(now,sum[now][i]);
cnt ++;
}
}
if(cnt == 0)
f[now][1] = w[now];
}

int main()
  {
while(scanf("%d%d",&n,&k)!=EOF)
 {
int i,a,b,maxs;
for(i=0;i<n;i++)
 {
scanf("%d",&w[i]);
sum[i].clear();
}
for(i=1;i<n;i++)
 {
scanf("%d%d",&a,&b);
sum[a].push_back(b);
sum[b].push_back(a);
}
maxs = 0;
memset(f,0,sizeof(f));
dfs(0,-1);//从任一点出发都行
for(i=0;i<n;i++)
if(maxs < f[i][k])
maxs = f[i][k];
printf("%d\n",maxs);
}
return 0;
}

|