You're given a tree with weights of each node, you need to find the maximum subtree of specified size of this tree.
Tree Definition
A tree is a connected graph which contains no cycles.
Input
There are several test cases in the input.
The first line of each case are two integers N(1 <= N <= 100), K(1 <= K <= N), where N is the number of nodes of this tree, and K is the subtree's size, followed by a line with N nonnegative integers, where the k-th integer indicates the weight of k-th node. The following N - 1 lines describe the tree, each line are two integers which means there is an edge between these two nodes. All indices above are zero-base and it is guaranteed that the description of the tree is correct.
Output
One line with a single integer for each case, which is the total weights of the maximum subtree.
Sample Input
3 1 10 20 30 0 1 0 2 3 2 10 20 30 0 1 0 2
Sample Output
30 40
题意:给定一棵树,求大小为k的一个子树的最大权值。
简单树形背包。
代码:
/* ***********************************************
Author :xianxingwuguan
Created Time :2014-2-3 21:04:40
File Name :1.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const int maxn=550;
int head[maxn],dp[maxn][maxn],tol,num[maxn];
struct node{
int next,to;
}edge[maxn];
void add(int u,int v){
edge[tol].to=v;
edge[tol].next=head[u];
head[u]=tol++;
}
int m;
void dfs(int u,int fa)
{
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
dfs(v,u);
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()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int i,j,k,n;
while(cin>>n>>m){
memset(head,-1,sizeof(head));
tol=0;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
cin>>j,dp[i][1]=j;
for(i=1;i<n;i++){
scanf("%d%d",&j,&k);
add(j,k);
add(k,j);
}
dfs(0,-1);
int ans=0;
for(i=0;i<n;i++)
ans=max(ans,dp[i][m]);
cout<<ans<<endl;
}
return 0;
}