AcWing 10. 有依赖的背包问题(树形dp + 分组背包)
#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = N<<1;
int n, m;
int h[N], e[M], ne[M], w[M], idx;
int dp[N][N];
void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
void dfs(int u, int father)
{
for(int i = h[u]; ~i; i=ne[i])
{
if(e[i]==father) continue;
dfs(e[i], u);
for(int j=m; j>=0; --j)
for(int k=0; k<j; ++k)
dp[u][j] = max(dp[u][j], dp[u][j-k-1]+dp[e[i]][k]+w[i]);
}
}
int main()
{
cin>>n>>m;
memset(h, -1, sizeof h);
for(int i=0; i<n-1; ++i)
{
int a, b, c;
cin>>a>>b>>c;
add(a, b, c), add(b, a, c);
}
dfs(1, -1);
cout<<dp[1][m]<<endl;
return 0;
}