二叉苹果树
有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)。这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树:
                                            2   5
                                             \  /
                                             3  4
                                              \  /

1

现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。

给定需要保留的树枝数量,求出最多能留住多少苹果。
程序名:apple
输入格式:
         第1行2个数,N和Q(1<=Q<= N,1<N<=100)。
         N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。
         每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。

每根树枝上的苹果不超过30000个。

输出格式:

一个数,最多能留住的苹果的数量。

输入样例:

5 2
         1 3 1
         1 4 10
         2 3 20
         3 5 20
  输入样例:

21

解题思路:树型DP+背包求解。

f(i, j) 表示子树i,保留j个节点(注意是节点)的最大权值。每条边的权值,把它看作是连接的两个节点中的儿子节点的权值。
                      那么,就可以对所有i的子树做分组背包,即每个子树可以选择1,2,...j-1条边分配给它。
                      状态转移为:
                       f(i, j) = max{ max{f(i, j-k) + f(v, k) | 1<=k<j} | v是i的儿子} 
                       ans = f(1, q+1)

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define MAX 105
#define INF 999999999
#define MP make_pair
typedef pair<int,int> PII;
vector<PII> adj[MAX];
int tot[MAX],f[MAX][MAX];
int max(int a,int b)
{return a>b?a:b;
}
int DFS(int u,int ff)
{tot[u]=1;int i,j,k;for(i=0;i<adj[u].size();i++){int v=adj[u][i].first;if(v==ff)continue;tot[u]+=DFS(v,u);}for(i=0;i<adj[u].size();i++){int v=adj[u][i].first;int w=adj[u][i].second;if(v==ff)continue;for(j=tot[u];j>1;j--){for(k=1;(k<j)&&(k<=tot[v]);k++)f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]+w);}}return tot[u];
}
int main()
{int i;int n,p,u,v,w;while(~scanf("%d%d",&n,&p)){for(i=0;i<MAX;i++)adj[i].clear();for(i=1;i<n;i++){scanf("%d%d%d",&u,&v,&w);adj[u].push_back(MP(v,w));adj[v].push_back(MP(u,w));}memset(f,0,sizeof(f));DFS(1,-1);printf("%d\n",f[1][p+1]);}return 0;
}

二叉苹果树(树型DP+背包)相关推荐

  1. 洛谷P2015 二叉苹果树【树形dp】

    P2015 二叉苹果树 时间限制 1.00s 内存限制 125.00MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点 ...

  2. 【算法•日更•第九期】树型动态规划详解:二叉苹果树

    ▎前置技能:动态规划&树 树型动态规划一听就知道是在树结构上使用的动态规划,那么不会树结构和动态规划怎么行?戳这里了解动态规划和树. ▎什么是树型动态规划? ☞『定义』 树形动态规划问题可以分 ...

  3. 洛谷2015 二叉苹果树 树形DP

    https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...

  4. AcWing1074. 二叉苹果树(树形DP)题解

    题目传送门 题目描述 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点. 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一 ...

  5. 树形DP入门(二叉苹果树+没有上司的舞会)

    树形dp学习笔记 - _Lancy - 博客园二叉苹果树 二叉苹果树 没有上司的舞会 二叉苹果树的处理可以说是非常模板了,正常容易联想到倒过来的数字三角形 for(int i=n;i>=1;i- ...

  6. 洛谷 P2015 二叉苹果树 题解

    洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...

  7. 其他OJ 树型DP 选课

    在朱全民的PPT介绍的一个树型DP经典题,<选课>,中文题目,不结束 找了很久找到了可以提交的OJ,重庆八中 http://www.cqoi.net:2012/JudgeOnline/pr ...

  8. 【CVPR2020-中科院-腾讯优图】基于注意力卷积二叉神经树的细粒度视觉分类

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 本文由腾讯优图实验室和中科院软件所联合提出.细粒度视觉分类(Fine-Graine ...

  9. 【树型DP】BZOJ1564 二叉查找树(noi2009)

    标签: 二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值 ...

最新文章

  1. 傅里叶变换取代Transformer自注意力层,谷歌这项研究GPU上快7倍、TPU上快2倍
  2. AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制)
  3. 2017202110104-高级软件工程2017第8次作业—个人总结
  4. dataframe中将一列数据切分成多列
  5. 记录 Linux crontab 的使用
  6. linux删除命令_【小技巧】Linux命令的快捷键
  7. 视觉设计基础知识整理
  8. 通过百度获取IP地址对应的经纬度
  9. OFFICE技术讲座:WP/SS文字渲染不开启的条件
  10. Oracle PLSQL语句实例
  11. ubuntu开机自启vnc虚拟显示器并使用向日葵远程连接
  12. 摸爬滚打DirectX11_day08——.X文件的导入
  13. 目前人工智能应用领域比较多,主要包含哪些应用领域?
  14. x的x分之一次方极限x趋于0_e的x分之一的左右极限
  15. Ubuntu 如何安装 微信?实测
  16. Google 人机验证(reCaptcha)无法显示解决方案
  17. 经典编程习题,用Java实现:矩阵转置、最大公约数和最小公倍数、计算自然对数的底e的值、输出1000以内的回文素数、判断两个年份之间的平闰年情况。
  18. Windows系统使用开源工具scrcpy投屏
  19. 【数据结构】线性表的应用:稀疏一元多项式运算器
  20. [物联网文章之其四] 在物联网中应用机器学习:使用 Android Things 与 TensorFlow

热门文章

  1. 计算机图形硬件---硬拷贝设备
  2. Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
  3. 在ISA 2006标准版上定制带宽和限制流量(测试)
  4. String StringBuilder StringBuffer 对比 总结得非常好
  5. [na][tools]快速ping网段工具-QuickPing
  6. 关于 tomcat 集群中 session 共享的三种方法
  7. 如何书写高质量的jQuery代码
  8. Git基础 1 ---- 版本控制系统的介绍
  9. Android 基础教程之-------Android ProgressBar的使用!
  10. good way for university professors accumulating the citation