AcWing 1074 二叉苹果树
题目描述: 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。 这棵树共 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 分析: 本题与 AcWing 10 有依赖的背包问题 十分相似,不过有依赖的背包问题是选择一个顶点前必须选择它的父节点,而本题是选择某条边前要确保其父节点也被选中了,也就是说一个是点权一个是边权问题。先回顾下分组背包问题的代码: for(int i = 1;i <= n;i++) for(int j = m;j >= 0;j--) for(int k = 1;k <= s[i];k++) if(j >= v[i][k]) f[j] =