HDU 1011 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1011
题目大意:树上取点,先取父亲,再取儿子。每个点,权为w,花费为cost,给定m消费总额,求最大权和。
解题思路:
树形背包模板题。首先建一个无向图。
每个点的cost=(bug[root]+19)/20,即虫子数不满20也要派一个人。
用dp[i][j]表示以i为根的子树中,花费为j的最大权和。
转移方程:dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[t][k]),其中t为儿子之一,k为分配给儿子的cost。
采用dfs对每个root进行DP。
每次dfs的时候,先对cost~m进行初始化,值为w[root],表示只取父亲的情况。
之后对每个儿子进行dfs,每次都是两个for循环。
for(m...j...cost)
for(1...k....j-cost) //儿子最多分配j-cost
则最后结果就是dp[1][m],其中1是总root点。
注意本题m可以等于0,所以在全部读入数据之后对0特判输出0,否则再dfs。
#include "cstdio"
#include "vector"
#include "cstring"
using namespace std;
#define maxn 500
int bug[maxn],w[maxn],head[maxn],n,m,u,v,tol;
struct Edge
{
int to,next;
}e[maxn*];
bool vis[maxn];
int dp[maxn][maxn];
void addedge(int u,int v)
{
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol++;
}
void dfs(int root,int pre)
{
int i=root,cost=(bug[root]+)/;
for(int i=cost;i<=m;i++) dp[root][i]=w[root];
for(int a=head[root];a!=-;a=e[a].next)
{
int t=e[a].to;
if(t==pre) continue;
dfs(t,root);
for(int j=m;j>=cost;j--)
for(int k=;k<=j-cost;k++)
dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[t][k]);
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&n>)
{
memset(head,-,sizeof(head));
memset(dp,,sizeof(dp));
tol=;
for(int i=;i<=n;i++)
scanf("%d%d",&bug[i],&w[i]);
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
if(m==) {printf("0\n");continue;}
dfs(,);
printf("%d\n",dp[][m]);
}
return ;
}
| 11488265 | 2014-08-19 12:44:12 | Accepted | 1011 | 62MS | 1280K | 1508 B | C++ | Physcal |
HDU 1011 (树形DP+背包)的更多相关文章
- hdu 1011 树形dp+背包
题意:有n个房间结构可看成一棵树,有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间有一定的敌人,每个士兵可以对抗20个敌人,士兵在某个房间对抗敌人使无法走开,同时有一个价值,问你花费这m个士 ...
- HDU 4003 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...
- HDU 1561 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有 ...
- hdu 1011 树形dp
题意:是有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs"和b的价值.你的一个士兵可以打20 个"bugs",为了拿到这个洞的价值 ...
- Starship Troopers(HDU 1011 树形DP)
题意: 给定n个定点和m个士兵,n个定点最终构成一棵树,每个定点有一定x个bugs和y个value,每20个bug需要消耗一个士兵,不足20也消耗一个,然后最终收获y个value,只有父节点被占领后子 ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- URAL_1018 Binary Apple Tree 树形DP+背包
这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
随机推荐
- python setup.py uninstall
I have installed a python package with python setup.py install How do I uninstall it? ============== ...
- MVC 修饰标签
MVC中的修饰标签有很多用途.它以修饰标签形式应用在控制器或控制器中的动作上. 最先想到的就是AcceptVerbs标签,在创建的时候,如果导航到创建视图,但不创建,则: public ActionR ...
- css调用外部样式和css样式说明剧中显示
<title>边走边乔</title><link href="css/style.css" rel="stylesheet" ty ...
- Maven发布web项目到tomcat
在java开发中经常要引入很多第三方jar包:然而无论是java web开发还是其他java项目的开发经常会由于缺少依赖包引来一些不必要的异常.常常也是因为这样的原因导致许多简单的缺包和版本问题耗费大 ...
- js: this,call,apply,bind 总结
对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非 ...
- July 12th, Week 29th Tuesday, 2016
When the traveler goes alone he gets acquainted with himself. 独自旅行可以让人更好地了解自己. With other's company, ...
- mongoose学习笔记1--基础知识2
Schema简述 Schema —— 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统 ...
- 大神的游戏(codevs 1353)
题目描述 Description 在那遥远的机房,有一片神奇的格子.为了方便起见,我们编号为1~n.传说只要放入一些卡片,就能实现愿望.卡片一共有m种颜色,但是相邻的格子间不能放入相同颜色的卡片.只要 ...
- exit()与_exit()函数的区别(Linux系统中)
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- ***CI查询辅助函数:insert_id()、affected_rows()
查询辅助函数 $this->db->insert_id() 这个ID号是执行数据插入时的ID. $this->db->affected_rows() Displays the ...