/*
dp[i][j]表示第i个节点及其子树取j个所得的最大值
在第i个节点的儿子节点有多个,而对于每个儿子节点及其对应的子树中选几个节点才能得到最大值
可以用背包来做
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 210
int dp[maxn][maxn];//dp[i][j]表示第i个节点及其子树取j个所得的最大值
int value[maxn];
int vis[maxn];
vector<int> vec[maxn];
int N,M;
int dfs(int root,int remain)//remain表示到了这个节点最多能选多少节点
{
int i;int j,k;
int amount=0;//表示以该节点为根节点的子树的所有的节点的个数
for(i=0;i<vec[root].size();i++)
{
int next=vec[root][i];
int sum;
sum=dfs(next,remain-1);//表示这个这个子树的节点总数
amount+=sum;
for(j=min(remain-1,amount);j>=1;j--)
for(k=1;k<=sum&&k<=j;k++)
dp[root][j]=max((dp[root][j-k]+dp[next][k]),dp[root][j]);