题意

  有n个洞穴编号为1~n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1。
  每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子.
  现在要派m个战士去找金子,从入口进入。每次只有消灭完当前洞穴的所有虫子,才可以选择进入下一个洞穴。
  一个战士可以消灭20只虫子,如果要杀死x只虫子,那么要x/20向上取整即(x+19)/20个战士。
  如果要获得某个洞穴的金子,必须留下足够杀死所有虫子的战士数量, 即(x+19)/20个战士,然后这些留下战士就不能再去其它洞穴
  其他战士可以继续走去其它洞穴,可以选择分组去不同的洞穴。
  战士只能往洞穴深处走,不能走回头路。
  问最多能获得多少金子?

思路:

  基础的树形DP。

  要特别注意的是,如果某个节点的bug数为0,而金子不为0,那么仍然需要派1个人以上去捡,而不是花0个士兵就能获得该点的金子。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=110;
 4 vector<int> vect[N];
 5 int bug[N], num[N], dp[N][N], n, m;
 6
 7 void DFS(int t,int far,int peo)
 8 {
 9     int need=(bug[t]+19)/20;
10     if(peo<need || peo==0)    return ;
11
12     for(int i=need; i<=peo; i++)    dp[t][i]=num[t];    //若有士兵i>=need个,那么起码拿到本节点的金子
13     for(int i=0; i<vect[t].size(); i++)
14     {
15         int to=vect[t][i];
16         if(to^far)
17         {
18             DFS(to, t, peo-need);
19             for(int j=peo; j>need; j--)         //到达本节点可能的人数。
20                 for(int k=1; k<=j-need; k++)    //给孩子to分配k个士兵。
21                     dp[t][j]=max(dp[t][j],dp[t][j-k]+dp[to][k]);
22         }
23     }
24 }
25
26
27 int main()
28 {
29     freopen("input.txt","r",stdin);
30     int u,v;
31     while(scanf("%d%d",&n,&m), n+m>0)
32     {
33         for(int i=0; i<=n; i++)    vect[i].clear();
34         memset(dp,0,sizeof(dp));
35
36         for(int i=1; i<=n; i++)      //房间里的bug数、金子
37             scanf("%d%d",&bug[i],&num[i]);
38         for(int i=1; i<n; i++)            //连通情况
39         {
40             scanf("%d%d",&u,&v);
41             vect[u].push_back(v);
42             vect[v].push_back(u);
43         }
44         DFS(1, -1, m);
45         printf("%d\n", dp[1][m]);
46     }
47     return 0;
48 }

AC代码

转载于:https://www.cnblogs.com/xcw0754/p/4241459.html

HDU 1011 Starship Troopers星河战队(树形dp)相关推荐

  1. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

  2. HDU 1011 Starship Troopers 树形+背包dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1011   题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...

  3. HDU 1011(星河战队 树形DP)

    题意是说在一个洞穴中有许多房间,每个房间中有一些虫子和大脑,这些房间之间用隧道相连形成一棵树,士兵们杀虫子的能力有限,也可以直接杀死虫子而不消耗士兵战斗力,但这样就无法得到房间中的大脑,士兵们不能走回 ...

  4. hdu 1011 Starship Troopers (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接 : hdu-1011 题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节 ...

  5. hdu 1561 The more, The Better 树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 做树形dp比较小. 先上网学习下,总结下套路. dp[i][j]表示在第i个节点,有j个名额选的时候的最大 ...

  6. HDU - 6769-In Search of Gold-二分+树形dp

    https://vjudge.net/problem/HDU-6769 题目大意:给你n个点,有n-1条边,每条边有a,b两个权值,给你一个k,恰好有k条边的权值取a,其余取b的时候,树的直径的最小值 ...

  7. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  8. 【HDU - 1520】Anniversary party (树形dp)

    题干: There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. Th ...

  9. hdu 4799 LIKE vs CANDLE(树形dp)

    题目链接:hdu 4799 LIKE vs CANDLE 解题思路 dp[i][0]表示第i个节点不翻转的最优解,dp[i][1]表示翻转的最优解,每个位置翻转的代价到其父亲节点的位置再计算. 代码 ...

最新文章

  1. 一文读懂如何通过设计模式学习创建对象?
  2. Golang的interface实践
  3. 极虎病毒创造四个“之最”
  4. java多线程阻塞队列_阻塞队列和多线程消费者,如何知道何时停止
  5. 获取input相同名字的元素的值
  6. 岗位多多,招聘 23人 | 中国农业科学院深圳农业基因组研究所诚聘博士后和科研人员...
  7. 汇编代码调用main和分配内存
  8. 第一次带姐姐和弟弟去看海
  9. Android MeasureSpec解析
  10. 支持全球科研抗疫,艾柏森成功研发Omicron变异株重组蛋白
  11. 利用Python绘制三维的规则体(3维柱体、立方体和旋转棱柱)
  12. Java常用的集成开发工具Eclipse和IDEA
  13. 唯美首页纯静态html引导页
  14. JS高级程序设计读书笔记(第五章 引用变量)
  15. 《全国青少年软件编程等级考试》2021年3月C语言一级真题(含答案)
  16. 一只喵的西行记-9 喵林英雄虹猫梦
  17. DD-路径图、MM-路径图的定义与区别联系
  18. 区块链技术的应用在数字藏品上的体现
  19. Ubuntu下使用gcc和makefile编写c语言程序
  20. GitHub疯狂转发!阿里巴巴彩版java性能调优实战,终于到手了!文末福利

热门文章

  1. 【致敬未来的攻城狮计划】--RA2E1 开发板测评(1)keil环境配置
  2. c语言 伪随机数程序,C语言的伪随机数
  3. 鸿蒙系统是基于linux开发的吗
  4. 关于sprintf函数详解
  5. RDKit|化学特征、药效团提取与2D药效团指纹计算
  6. 【JavaScript】04-js函数
  7. 5年客户端开发的程序员如何转型服务端开发?
  8. 《趣谈网络协议》(刘超老师)读后笔记记录 003
  9. 读 《如何判断自己的文章好坏》
  10. 赛门铁克Symantec还原ghost系统文件操作(超详细)