用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]);
}
}
}
}