题解:树上背包详细题解
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const ll mod=1e9+7;
int n,value;
struct node{
int to;
int key;
};
vector<node>mp[Max];
int dp[1000][1000];
void dfs(int fa,int x){
for(int i=0;i<mp[x].size();i++){
int v=mp[x][i].to;
if(fa==v) continue;
dfs(x,v);
int len=mp[x].size();
for(int j=value;j>0;j--){
for(int k=1;k<=j;k++){
dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[v][k-1]+mp[x][i].key);
}
}
}
}
int main(){
sc(n);sc(value);
for(int i=0;i<n-1;i++){
int u,v,w;
sc(u);sc(v);sc(w);
mp[u].pb({v,w});
mp[v].pb({u,w});
}
dfs(0,1);
cout<<dp[1][value]<<endl;
}