HDU 1011 Starship Troopers (树dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011
题意:
题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间里有一个代价,代价是值/20个士兵,
同时有一个价值,问你花费这m个士兵可以得到的最大价值是多少。
思路:
树上背包,这题比较坑爹。士兵为0,输出0。要是一个房间的cost不足20的倍数也要补全20的倍数。
dp[i][j]表示以i节点为子树的root使用j个士兵的最大价值( 不用管父节点 ),dp[i][j] = max(dp[i][j] , dp[i.son][k] + dp[i][j - k])
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = ;
int cost[N], val[N];
vector <int> G[N];
int dp[N][N], n, m; void dfs(int u, int p) {
int temp = (cost[u] + ) / ;
if(temp > m)
return ;
for(int i = temp; i <= m; ++i) {
dp[u][i] = val[u];
}
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(v == p)
continue;
dfs(v, u);
for(int j = m; j >= temp + ; --j) { //类似背包 每个可取的值只枚举一次
for(int k = temp; k < j; ++k) { //每条路径上会保证有一个士兵
dp[u][j] = max(dp[u][j], dp[u][k] + dp[v][j - k]);
}
}
}
} int main()
{
while(~scanf("%d %d", &n, &m)) {
if(m == - && n == -)
break;
memset(dp, , sizeof(dp));
for(int i = ; i <= n; ++i) {
G[i].clear();
scanf("%d %d", cost + i, val + i);
}
int u, v;
for(int i = ; i < n; ++i) {
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(, -);
if(!m) {
printf("0\n");
} else {
printf("%d\n", dp[][m]);
}
}
return ;
}
HDU 1011 Starship Troopers (树dp)的更多相关文章
- hdu 1011 Starship Troopers(树形DP入门)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- [HDU 1011] Starship Troopers (树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 dp[u][i]为以u为根节点的,花了不超过i元钱能够得到的最大价值 因为题目里说要访问子节点必 ...
- HDU 1011 Starship Troopers 树形DP 有坑点
本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...
- hdu 1011 Starship Troopers 经典的树形DP ****
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- hdu 1011 Starship Troopers 树形背包dp
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1011(Starship Troopers,树形dp)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1011 Starship Troopers(树形背包)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- [HDU 1011] Starship Troopers
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- 常用排序算法的总结以及编码(Java实现)
常用排序算法的总结以及编码(Java实现) 本篇主要是总结了常用算法的思路以及相应的编码实现,供复习的时候使用.如果需要深入进行学习,可以使用以下两个网站: GeeksForGeeks网站用于学习相应 ...
- Python json和simplejson的使用
在Python中,json数据和字符串的转换可以使用json模块或simplejson模块. json从Python2.6开始内置到了Python标准库中,我们不需要安装即可直接使用. simplej ...
- 五一4天就背这些Python面试题了,Python面试题No12
第1题: Python 中的 os 模块常见方法? os 属于 python内置模块,所以细节在官网有详细的说明,本道面试题考察的是基础能力了,所以把你知道的都告诉面试官吧 官网地址 https:// ...
- Python头脑风暴2
今天想到了一个致富新途径:假如我在X东上班,我写个X宝爬虫,专门爬在X宝买奢侈品的土豪,然后我自己注册个X宝号,用脚本一个个加他们然后给他们发信息说我X东这还有比你更便宜更好的...不知道行不行啊(狗 ...
- aoj-0118 property distribution(搜索)
Time limit1000 ms Memory limit131072 kB タナカ氏が HW アールの果樹園を残して亡くなりました.果樹園は東西南北方向に H × Wの区画に分けられ.区画ごとにリ ...
- Linux学习-CentOS 7.x 预设启动的服务简易说明
这里 仅介绍几个很常见的 daemons 而已,更多的信息呢,就得要麻烦你自己使用 systemctl list-unit-files --type=service 去查询.底下的建议主要是针对 Li ...
- Centos7 install Openstack Juno (RDO) (转载)
原文地址:http://www.hdume.com/centos-7-0%E5%AE%89%E8%A3%85openstack/ 1.安装系统,Centos7镜像采用CentOS-7.0-1406-x ...
- meta-data
<meta-data android:name="string" android:resource="resource specification" ...
- JavaScript日期时间格式化函数
这篇文章主要介绍了JavaScript日期时间格式化函数分享,需要的朋友可以参考下 这个函数经常用到,分享给大家. 函数代码: //格式化参数说明: //y:年,M:月,d:日,h:时,m分,s:秒, ...
- 包含min函数的栈 【微软面试100题 第二题】
题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 参考题目:剑指offer第21题. 题目分析: 1. ...