树上背包(新模板 & 理解3)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const N=1e2+7;
int const M=1e2+7;
int n,m;
struct node{
	int a,next,len;
}e[M<<1];
int cnt,head[N];
void add(int x,int y,int len){
	e[++cnt].a=y;
	e[cnt].len=len;
	e[cnt].next=head[x];
	head[x]=cnt;
}
ll f[N][M];
void dfs(int x,int fa){
	for(int i=head[x];i;i=e[i].next){
		int v=e[i].a;
		if(v==fa) continue;
		dfs(v,x);   //枚举右子树  //也可以看成背包中的枚举物品   //枚举右子树的根并且预处理右子树 
		for(int j=m;j>=1;--j){   //可以看成背包中的枚举体积
			for(int k=0;k<=j-1;++k){    //右子树保留的边数  //枚举物品v的体积
				f[x][j]=max(f[x][j],f[x][j-k-1]+f[v][k]+e[i].len);   //在这里以v为根的右子树为已知条件,所以f[x][k]为转移f[x][j]的前驱,为避免错误,所以j倒着枚举 ,背包一般都是j倒着枚举 
				//k为物品体积,f[v][k]+len为物品价值  //背包一般都省略了一维i,在考虑是否倒着循环,要考虑i  
			}
		}	
	}
}
int main(){
	cin >> n >> m;
	for(int i=1,a,b,c;i<=n-1;++i){
		cin >> a >> b >> c;
		add(a,b,c);add(b,a,c);
	}
	dfs(1,1);
	cout << f[1][m];
	return 0;
}


全部评论

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务