因为是枚举的每个分支,就是不可能在一个分支没选完就选第二个分支,然后转移就很合理了.就是两个分支可以看成01背包,然后保留多少个可以看成背包容量..就没了

#include <bits/stdc++.h>
using namespace std;
const int N=105;
struct vv{
    int to,val;
};
vector<vv>v[N];
int dp[N][N];//以i为根节点 保留j的数量能获得的最大价值.
int n,q;
void dfs(int u)
{
    for(int i=0;i<v[u].size();i++)//枚举节点
    {
        int x=v[u][i].to;
        dfs(x);
        for(int j=q;j>=1;j--)
        {
              for(int k=j-1;k>=0;k--)
              {
                  dp[u][j]=max(dp[u][j],dp[x][k]+dp[u][j-k-1]+v[u][i].val);
              }
        }
    }
}

int main()
{
    cin>>n>>q;
    for(int i=1;i<n;i++)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        v[x].push_back({y,w});//建边
    }
    dfs(1);
    cout<<dp[1][q]<<endl;
    return 0;
}