用f[x][y]表示以x为根的数里,选了y个的最大值。
然后树形dp
是一个背包啦
我们dfs每一个x,对于每一个x,枚举他的儿子们,
再一个个枚举y。
然后再一个个枚举他的儿子取了几个(k)
记得要存一下g!!!不然你更新的时候会出点问题。。。
因为g是没有用过儿砸的时候的值,不然就不是惹。。。
void find(int x)
{
f[x][1]=val[x];
for(int i=0;i<v[x].size();i++)
{
if(fa[x]!=v[x][i]) fa[v[x][i]]=x;
else continue;
find(v[x][i]);
memcpy(g,f[x],sizeof(g));
for(int j=1;j<=m;j++)
{
for(int k=0;j+k<=m;k++)
{
f[x][j+k]=max(f[x][j+k],g[j]+f[v[x][i]][k]);
}
}
}
}