#include <iostream>
#include <cstdio>
const int N = 110;
using namespace std;
int n,q,f[N][N],a[N],head[N],tot,zb[N];
struct made{
int next,w,to;
}h[N*2];
void add(int x,int y,int z){
tot++;
h[tot] = {head[x],z,y},head[x] = tot;
}
void sou(int r,int fa){
for(int i = head[r];i;i = h[i].next){
int so = h[i].to;
if(so == fa)continue;
sou(so,r);
zb[r] += zb[so] + 1;
for(int j = min(zb[r],q);j;--j)
for(int k = min(zb[so],j-1);k >= 0;--k)//在这。。。
f[r][j] = max(f[r][j],f[r][j-k-1]+f[so][k]+h[i].w);
}
}
int main(){
scanf("%d %d",&n,&q);;
for(int i = 1;i < n;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
sou(1,0);
printf("%d\n",f[1][q]);
return 0;
}
#include <iostream>
#include <cstdio>
const int N = 110;
using namespace std;
int n,q,f[N][N],a[N],head[N],tot,zb[N];
struct made{
int next,w,to;
}h[N*2];
void add(int x,int y,int z){
tot++;
h[tot] = {head[x],z,y},head[x] = tot;
}
void sou(int r,int fa){
for(int i = head[r];i;i = h[i].next){
int so = h[i].to;
if(so == fa)continue;
sou(so,r);
zb[r] += zb[so] + 1;
for(int j = min(zb[r],q);j;--j)
for(int k = 0;k <= min(zb[so],j-1);++k)//在这。。
f[r][j] = max(f[r][j],f[r][j-k-1]+f[so][k]+h[i].w);
}
}
int main(){
scanf("%d %d",&n,&q);;
for(int i = 1;i < n;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
sou(1,0);
printf("%d\n",f[1][q]);
return 0;
}
请问大佬为什么k也要倒序; 明明两个代码都AC了