二叉苹果树(树型DP+背包)
来源:互联网 发布:阿里巴巴开淘宝 编辑:程序博客网 时间:2024/05/16 00:59
二叉苹果树
有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)。这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树:
2 5
\ /
3 4
\ /
程序名:apple
输入格式:
第1行2个数,N和Q(1<=Q<= N,1<N<=100)。
N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。
每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。
1 3 1
1 4 10
2 3 20
3 5 20
输入样例:
有一棵苹果树,如果树枝有分叉,一定是分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 21 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_pairtypedef 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;}
0 0
- 二叉苹果树(树型DP+背包)
- 二叉苹果树[树型DP]
- 二叉苹果树 树形DP
- 【树形dp】二叉苹果树
- 二*苹果树[树型DP]
- SSL 1605 二叉苹果树 树形dp
- 洛谷P2015 二叉苹果树(树形dp)
- [题解] P2015 二叉苹果树(树形DP)
- 二叉苹果树
- 二叉苹果树
- 二叉苹果树
- 【codevs】二叉苹果树 (二叉树的树形dp)
- [树上依赖多重背包 DP] BZOJ 4910 [Sdoi2017]苹果树
- [caioj 1114]多叉苹果树---树形dp+01背包
- URAL 1018 二叉苹果树(简单树形dp)
- URAL_1018之二叉苹果树
- ural 1018 二叉苹果树
- Ural1018 二叉苹果树
- 仿春意盎然ecshop模板
- linux路径标准化
- float 元素的水平居中
- 并发编程实践五:ReentrantLock
- spring mvc源码分析(续)——视图解析过程
- 二叉苹果树(树型DP+背包)
- 精通initramfs构建step by step
- Matlab绘图和坐标操作(全)
- 数据并行(Data Parallelism)
- Linux的五个查找命令:find,locate,whereis,which,type/区别
- 火狐浏览器启动慢?--几点办法
- 南昌市与国开金融公司签署投资协议书
- 空杯心态
- poj2000--Gold Coins