思路:
按照有依赖的背包问题进行求解,
fij, 以i为根的树中,体积为j的最大的价值,可以再去考虑每一棵子树的每一个体积,从小到大,然后去更新i根的树的最大价值。
#include
#include
using namespace std;
const int N = 1e2+10;
vector<pair<int,int>> v[N];
int f[N][N];
int n,m;
void dfs(int u,int father){
for(auto i:v[u]){
int a = i.first;
int w = i.second;
if(a == father) continue;
dfs(a,u);
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-1]+f[a][k]+w);
}
}
}
}
int main() {
cin>>n>>m;
for(int i =1 ;i<n;i++){
int a,b,w;
cin>>a>>b>>w;
v[a].push_back({b,w});
v[b].push_back({a,w});
}
dfs(1,-1);
cout<<f[1][m];
return 0;
}