hdu1011(树形背包)
hdu1011 http://acm.hdu.edu.cn/showproblem.php?pid=1011
给定n个洞穴和m个士兵(每个士兵能消灭20个bugs)
然后给定每个洞穴的bugs数量(背包的费用)和brain的数量(背包的价值)
然后给定n-1条边,使得n个洞穴形成一课树
问能取得的brain数量的最大值。
思路:其实就是在树上面进行背包问题的求解,只不过是有依赖的背包(儿子要选,当且仅当父亲也被选)
普通的01背包是这样
for(i=每件物品)
for(j=每个容量)
dp[i][j] = max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);
即对于每个物品,求出各个容量的背包对于第i件物品处理完之后的最大值。
那么在树上面进行背包问题,同样要是这样。
第一个循环:
但是因为背包是树形的,所以不能用循环来遍历背包,要用dfs来进行遍历
第二个循环:
因为是有依赖的背包问题,儿子要选,当且仅当父亲也被选。所以我们要枚举父亲的容量和儿子的容量进行状态转移(即两重循环)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
typedef long long LL;
const int INF = <<;
const int N = +;
struct Cave
{
int bugs,brain;
}cave[N];
int dp[N][N];
struct Edge
{
int v,next;
}g[N<<];
int head[N],e; /*
背包?
有依赖的背包
容量为m
费用为bugs的数量, 价值为brain的数量
对于每个洞穴,选或者不选
这个洞穴要选,当且仅当父亲被选
*/
bool vis[N];
int m;
void dfs(int u, int fa)
{
vis[u] = true;
int t = (cave[u].bugs+)/;
for(int i=t; i<=m; ++i)
dp[u][i] = cave[u].brain;
for(int i=head[u]; i!=-; i=g[i].next)
{
int v = g[i].v;
if(vis[v]) continue;
dfs(v,u);
for(int j=m; j>=t; --j)//必须从后往前推??? 由转移方程可以看出,前面的状态依赖于后面的状态,所以要求出后面的状态
for(int k=; k+j<=m; ++k)//所有可能的情况都要枚举,然后求出最大值
dp[u][j+k] = max(dp[u][j+k],dp[u][j]+dp[v][k]); }
}
void init(int n)
{
for(e=; e<=n; ++e)
{
head[e] = -;
vis[e] = false;
}
e = ;
}
void addEdge(int u, int v)
{
g[e].v = v;
g[e].next = head[u];
head[u] = e++;
}
int main()
{
int n,i,u,v;
while(scanf("%d%d",&n,&m),n!=-)
{
init(n);
for(i=; i<=n; ++i)
scanf("%d%d",&cave[i].bugs,&cave[i].brain);
for(i=; i<n; ++i)
{
scanf("%d%d",&u,&v);
addEdge(u,v);
addEdge(v,u);
}
if(m==)
{
puts("");
continue;
}
memset(dp,,sizeof(dp));
dfs(,-);
printf("%d\n",dp[][m]);
}
return ;
}
样例:

hdu1011(树形背包)的更多相关文章
- poj2486Apple Tree[树形背包!!!]
		Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9989 Accepted: 3324 Descri ... 
- cdoj 1136 邱老师玩游戏 树形背包
		邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ... 
- HDU 1011 树形背包(DP) Starship Troopers
		题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ... 
- poj 1155 TELE (树形背包dp)
		本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ... 
- bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]
		4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ... 
- [HAOI2015]树上染色(树形背包)
		有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之间的距离加 ... 
- Luogu 1273 有线电视网 - 树形背包
		Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移. Code #include<cstring> #include<cstdio> ... 
- BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包
		分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ... 
- [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序
		分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ... 
- BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜
		传送门 BZOJ 2427 题解 Tarjan把环缩成点,然后跑树形背包即可. 我用的树形背包是DFS序上搞的那种. 要注意dp数组初始化成-INF! 要注意dp顺推的时候也不要忘记看数组是否越界! ... 
随机推荐
- mysql  READ-COMMITTED 模式下 行锁不会升级到表级锁
			mysql> select sn,id,info from s100 group by id; +-----+------+------+ | sn | id | info | +-----+- ... 
- Could not find or load main class
			Then add '.' to your $CLASSPATH with CLASSPATH=.:$CLASSPATH or as a paramater with java -classpath . ... 
- [计算机基础]关于实体( Entity )和模型( Model )
			实体与模型的浅析 在日常开发过程中经常看到Entity,Model,DataModel,它们之间到底有什么异同?下面是我个人的一些理解. 一.Entity,Model,它们是什么? 维基百科描述: 实 ... 
- uva 10655 - Contemplation! Algebra(矩阵高速幂)
			题目连接:uva 10655 - Contemplation! Algebra 题目大意:输入非负整数,p.q,n,求an+bn的值,当中a和b满足a+b=p,ab=q,注意a和b不一定是实数. 解题 ... 
- 随想录(关于ucore)
			[ 声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 之前用过一段时间skyeye,也对开发skyeye的陈渝有一些了解.近期在github上闲逛的 ... 
- thinkphp3.2
			1.安装WAMPServer,到D:\wamp\. 2.下载ThinkPHP3.2.2核心版.解压缩后,放到D:\wamp\www\MyWeb\.打开浏览器,输入网址:http://localhost ... 
- PV(访问量)、UV(独立访客)、IP(独立IP) (转)
			网站统计中的PV(访问量):UV(独立访客):IP(独立IP)的定义与区别今天使用了雅虎统计,看到里面就有这个,就说说,其实里面的uv大家可能觉得很新奇,但是和站长统计里的独立访客是一样的嘛.---- ... 
- bzoj1497(最小割)
			传送门:最大获利 题意:建立n个中转站,每个花费P[i],有m个用户,使用Ai和Bi中转站可获利Ci,问最终建立哪几个中转站使获利最大? 分析:根据最大权闭合图建图,用户群和中转站为带权的点集,用户群 ... 
- Amazon.com : The Odyssey of the Manual Toothbrusher
			Amazon.com : The Odyssey of the Manual Toothbrusher The Odyssey of the Manual Toothbrusher 
- Nlog配置文件
			<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nl ... 
