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顺推的时候也不要忘记看数组是否越界! ...
随机推荐
- MFC消息映射的原理:笔记
多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里 ...
- 无边无状态栏窗口(使用GetWindowLongPtr设置GWL_EXSTYLE)
通过SetWindowLongPtr来设置窗口样式 var NewStyle: Integer; begin Application.Initialize; Application.MainFormO ...
- C++ map
C++ map Map is an associative container that contains a sorted list of unique key-value pairs. That ...
- Qt4在linux下的安装
1.下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensou ...
- uva 1415 - Gauss Prime(高斯素数)
题目链接:uva 1415 - Gauss Prime 题目大意:给出一个a,b,表示高斯数a+bi(i=−2‾‾‾√,推断该数是否为高斯素数. 解题思路: a = 0 时.肯定不是高斯素数 a != ...
- setenv 和 set
setenv 和 set 是在csh系列的命令,当然bash中也有set,还是有出入的. set 是对当前进程有效,不会传递给子进程 setenv 不仅对当前进程有效,也会传递给子进程. 语法 ...
- JSF之经常使用注解
@ManagedBean 以托管 bean 的形式注冊一个类实例.然后将其放入到使用当中一个 @...Scoped 凝视指定的范围内.假设没有指定不论什么范围.JSF 将把此 bean 放入请求范围. ...
- 基于三星I9250演示自己弄的Miracast功能-手机对手机
最终把Miracast功能測试通了,为了节省时间.我的Source端和Sink端都採用同一个机型.这样能够降低我为目标机编译4.4.2源码所耗费的时间.今天简单录制了一段视频.视频是用手机录制的,室内 ...
- 2014辽宁省赛 Repeat Number
问题 C: Repeat Number 时间限制: 1 Sec 内存限制: 128 MB [cid=1073&pid=2&langmask=0">提交][状态][论坛 ...
- 【剑指offer】q34:丑数
题目要求第n个丑数.所以对于中间结果不须要保存. def Humble(index): curHum = 1 M2 = 2; M3 = 3; M5 = 5 while index > 1: cu ...