hdu1011
/*比较苦逼的树形DP,慢慢来吧!不着急*/
#include <iostream>
#include <vector>
using namespace std;
const int SIZE = 105;
int roomNumber, trooperNumber;
int cost[SIZE], brain[SIZE];
int dp[SIZE][SIZE]; /*dp[u][p]表示用 P 个士兵占领以 u 为根节点的子树所能获得的概率最大值*/
vector<int> adj[SIZE]; /*图*/
void dfsPulsDp(int p, int pre)
{
for (int i = cost[p]; i <= trooperNumber; ++i) /*初始化,首先将dp[p][i]里面填充进brain[p],后面可以更新dp[p][i]的值*/
dp[p][i] = brain[p]; /*也就是说当我们有cost[p]名队员以至于更多时,我们最少可以获得brain[p]个大脑*/
int num = adj[p].size(); /*num指p节点含有的支路数*/
for (int i = 0; i < num; ++i) /*一条支路一条支路遍历,也就是所谓的dfs*/
{
int v = adj[p][i];
if (v == pre) continue; /*避免死循环,节点如果是根部,就继续*/
dfsPulsDp (v, p); /*递归解决问题,先将子节点的所能得到的最大值计算出来*/
for (int j = trooperNumber; j >= cost[p]; --j) /*当队员人数一定时*/
for (int k = 1; k <= j - cost[p]; ++k) /*由于p节点一定要通过,所以一定要花费cost[p]*/
if (dp[p][j] < dp[p][j - k] + dp[v][k])
{/*v节点就两种状态,要么选择,要么不选择,选择的话dp[p][j] = dp[p][j - k] + dp[v][k],不选择的话就不变*/
dp[p][j] = dp[p][j - k] + dp[v][k];
}
}
}
int main()
{
while ((cin >> roomNumber >> trooperNumber) && (roomNumber != -1) && (trooperNumber != -1))
{
int bug, bi1, bi2;
int i;
for (i = 0; i < roomNumber; i++)
{
cin >> bug >> brain[i];
cost[i] = (bug + 19) / 20;
}
for (i = 0; i < roomNumber; i++)
adj[i].clear();
for (i = 0; i < roomNumber - 1; i++)
{
cin >> bi1 >> bi2;
adj[bi1 - 1].push_back(bi2 - 1);
adj[bi2 - 1].push_back(bi1 - 1);
}
if (trooperNumber == 0)
{
cout << '0' << endl;
continue;
}
memset(dp, 0, sizeof(dp));
dfsPulsDp(0, -1);
cout << dp[0][trooperNumber] << endl;
}
return 0;
}
hdu1011的更多相关文章
- 树形dp入门练习(hdu1011+hdu1061)
hdu1011 和 hdu1561类似,给定每个节点的花费以及价值,并且子节点必须在父亲节点取到以后才可以被取到 相当于是在树上进行的01背包 dp时考虑每一个子树 root和它的每一个儿子,状态转移 ...
- hdu1011(树形背包)
hdu1011 http://acm.hdu.edu.cn/showproblem.php?pid=1011 给定n个洞穴和m个士兵(每个士兵能消灭20个bugs) 然后给定每个洞穴的bugs数量(背 ...
- HDU1011 树形DP
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU-1011 Starship Troopers (树形DP+分组背包)
题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...
- hdu1011(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs& ...
- hdu1011 Starship Troopers 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 思路:很明显的树形背包 定义dp[root][m]表示以root为根,派m个士兵的最优解,那么d ...
- hdu1011(树形背包)(提供一个特殊样例)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 Starship Troopers Time Limit: 10000/5000 MS (Jav ...
- HDU-1011 Starship Troopers(树形dp)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 【HDU1011】Starship Troopers
题目大意:给定一棵 N 个节点的无根树,每个节点有一个重量和一个价值,现给出一些单位,每个单位可以接受 20 个重量单位,求如何分配这些单位,使得获得的价值最大. 题解:dp 好题qwq..真的毒瘤. ...
随机推荐
- Linux install sogou input method
# Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights reserved.# 转载请注明出处 Linux下安装搜狗输入法需要安装以下插件,当以下所有插件安装 ...
- Dockerfile文件格式的简单介绍
# This dockerfile uses the ubuntu image # VERSION 2 - EDITION 1 # Author: docker_user # Command form ...
- Hadoop基本命令详解
调用文件系统(FS)Shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI路径详解点击这里. 1.cat 说明:将路 ...
- qdoc 写法
Qdoc 注释 Qdoc注释有一些命令, 能够对文档进行组织. QDoc能识别以下3种类型的命令 主题(topic command) 主题命令确定了文档的元素,例如C++类(class),函数(fun ...
- svn服务器搭建-SuSE Linux Enterprise Server 11 SP3
svn存储版本数据也有2种方式: 1.bdb: 2.fsfs. 因为BDB方式在服务器中断时,有可能锁住数据(搞ldap时就深受其害,没法根治),所以还是FSFS方式更安全一点,我也选择这种方式. ...
- jq屏蔽f5
//屏蔽F5 $(document).ready(function () { $(document).bind("keydown", function (e) { e = wind ...
- python3 列表 函数
python3中list的所有函数 list是有序的,元素个数无限的,元素类型多样的,可变的 增加 # 'append', 增加对象# 'insert', 指定位置增加# 'extend', 增加可迭 ...
- zabbix 布署实践【3 proxy安装】
使用openstack在生产环境创建的一台虚拟机 环境 CentOS7 4核4G内存40G硬盘 IP:10.120.150.150 镜像默认关闭防火墙,selinux ,NetworkManage ...
- CodeForces 689D Friends and Subsequences
枚举,二分,$RMQ$. 对于一个序列来说,如果固定区间左端点,随着右端点的增大,最大值肯定是非递减的,最小值肯定是非递增的. 因此,根据这种单调性,我们可以枚举区间左端点$L$,二分找到第一个位置$ ...
- FZU 2238 Daxia & Wzc's problem
公式. $a×C_{m + i - 1}^m + d×C_{m + i - 1}^{m + 1}$. 推导过程可以看http://blog.csdn.net/queuelovestack/articl ...