题目描述
blablabla
样例
blablabla
算法
大概就是可依赖形背包那题的转移…emm,就没了.f[u][v]表示u为根的子树分配v所获得的最大价值.
(树形dp) $O(n^3)$
C++ 代码
//orz 模板题
#include <bits/stdc++.h>
using namespace std;
const int N=305;
int n,m;
vector<int>v[N];
int w[N];
int f[N][N];
void dfs(int u)
{
for(int i=0;i<v[u].size();i++)//枚举物品.
{
int x=v[u][i];
dfs(x);
for(int j=m;j>=0;j--)//枚举容量.
{
for(int k=0;k<=j;k++)//枚举分配方案.
{
f[u][j]=max(f[u][j],f[u][j-k]+f[x][k]);
}
}
}
if(u!=0)
{
for(int i=m;i>=1;i--)
{
f[u][i]=f[u][i-1]+w[u];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(i);//建树.
w[i]=y;
}
dfs(0);
printf("%d\n",f[0][m]);
return 0;
}