大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。
这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1。
我们用一根树枝两端连接的节点编号描述一根树枝的位置。
一棵苹果树的树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。
这里的保留是指最终与1号点连通。
输入格式
第一行包含两个整数 N 和 Q,分别表示树的节点数以及要保留的树枝数量。
接下来 N−1 行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个数是这根树枝上苹果数量。
输出格式
输出仅一行,表示最多能留住的苹果的数量。
数据范围
1≤Q<N≤100.
N≠1,
每根树枝上苹果不超过 30000 个。
输入样例:
5 2
1 3 1
1 4 10
2 3 20
3 5 20
输出样例:
21
题解
有依赖的背包问题
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int f[N][N];
struct Edge{
int v,w,next;
}edge[N * 2];
int head[N],cnt;
int n,V;
void add(int u,int v,int w){
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
void dfs(int u,int fa){
for(int i = head[u];~i;i = edge[i].next){
int v = edge[i].v,w = edge[i].w;
if(v == fa)continue;
dfs(v,u);
for(int i = V;i >= 1;i --){
for(int j = 0;j <= i - 1;j ++){
f[u][i] = max(f[u][i],f[u][i - j - 1] + f[v][j] + w);
}
}
}
}
int main(){
cin>>n>>V;
int x,y,w;
memset(head,-1,sizeof head);
for(int i = 0;i < n - 1;i ++){
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
dfs(1,-1);
cout<<f[1][V]<<endl;
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168634.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...