P2015 二叉苹果树(树上背包基础)

树枝个数加上一,得到节点个数。
这题用树形背包基础上下界优化就可以通过。

代码就没有节操地贴以前的了。

#include<bits/stdc++.h>
#define f(i,a,b) for(register int i=a;i<=b;++i)
#define F(i,a,b) for(register int i=b;i>=a;--i)
using namespace std;
const int N=109;
int n,q,dp[N][N];
struct node{int v,w;};
vector<node> o[N];
void dfs(int i,int f){
	for(node j:o[i]) if(j.v!=f) dfs(j.v,i);
	for(node j:o[i]) if(j.v!=f) F(k,1,q) f(x,0,k-1)
		dp[i][k]=max(dp[i][k],dp[i][k-1-x]+j.w+dp[j.v][x]);
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1,u,v,w;i<n;i++){
		scanf("%d%d%d",&u,&v,&w);
		o[u].push_back({v,w});
		o[v].push_back({u,w});
	}
	dfs(1,1),printf("%d",dp[1][q]);
	return 0;
}
posted @ 2026-02-21 22:33  2025ing  阅读(0)  评论(0)    收藏  举报