直接上代码:
#include<bits/stdc++.h>
using namespace std;
int pg[110][110],n,q,dp[110][110];
bool pan[200];
void in(){
cin>>n>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
pg[i][j]=-1;
}
}
for(int i=1;i<n;i++){
int x,y,j;
cin>>x>>y>>j;
pg[x][y]=j;
pan[x]=true;//标记是否有孩子
}
}
int dfs(int f,int zhi){
if(!pan[f])return 0;//如果没有孩子就直接返回0
if(zhi<=0)return 0;//没枝了也返回0
if(dp[f][zhi]!=-1)return dp[f][zhi];
int v1=0,v2=0;
for(int i=1;i<=n;i++){
if(v1==0&&pg[f][i]!=-1)
v1=i;
else if(v2==0&&pg[f][i]!=-1)
v2=i;
}//找到两个孩子
int ans=0;
if(zhi>=2){
for(int i=0;i<=zhi-2;i++){
ans=max(ans,dfs(v1,i)+dfs(v2,zhi-2-i)+pg[f][v1]+pg[f][v2]);
}
ans=max(ans,dfs(v1,zhi-1)+pg[f][v1]);
ans=max(ans,dfs(v2,zhi-1)+pg[f][v2]);
}
else if(zhi==1){
ans=max(dfs(v1,zhi-1)+pg[f][v1],dfs(v2,zhi-1)+pg[f][v2]);
}
return dp[f][zhi]=ans;
}
int main(){
in();
memset(dp,-1,sizeof(dp));//将dp全部二进制初始化为-1;
cout<<dfs(1,q);
}