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)的最大全值为多少。
解题思路:只是一个很明显的数型dp题目,dp[roon][k]表以root为根节点,有k个节点的最大权值,dp[root][k]=max(dp[root][k-t]+dp[son][t],dp[root][k])
代码:
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; #define N 105 int a[N],k; int dp[N][N]; struct node { int st,en,next; }e[N*2]; int num,p[N]; void init() { memset(p,-1,sizeof(p)); num=0; } void add(int st,int en) { e[num].st=st; e[num].en=en; e[num].next=p[st]; p[st]=num++; } int dfs(int root,int fa) { dp[root][1]=a[root]; for(int i=p[root];i+1;i=e[i].next) { int son=e[i].en; if(son==fa)continue; dfs(son,root); for(int j=k;j>0;j--) { for(int tt=1;tt<=j;tt++) dp[root][j]=max(dp[root][tt]+dp[son][j-tt],dp[root][j]); } } } int main() { int n,s,ee; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<=n;i++) for(int j=0;j<=k;j++) dp[i][j]=0; init(); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=1;i<n;i++) { scanf("%d%d",&s,&ee); add(s,ee); add(ee,s); } dfs(0,-1); int ans=-1; for(int i=0;i<n;i++) { ans=max(ans,dp[i][k]); } printf("%d\n",ans); } return 0; }