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;
}

浙公网安备 33010602011771号