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来进行遍历

第二个循环:

  因为是有依赖的背包问题,儿子要选,当且仅当父亲也被选。所以我们要枚举父亲的容量和儿子的容量进行状态转移(即两重循环)

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <queue>
  7. #include <stack>
  8. #include <vector>
  9. #include <map>
  10. #include <set>
  11. #include <string>
  12. #include <math.h>
  13. using namespace std;
  14. typedef long long LL;
  15. const int INF = <<;
  16. const int N = +;
  17. struct Cave
  18. {
  19. int bugs,brain;
  20. }cave[N];
  21. int dp[N][N];
  22. struct Edge
  23. {
  24. int v,next;
  25. }g[N<<];
  26. int head[N],e;
  27.  
  28. /*
  29. 背包?
  30. 有依赖的背包
  31. 容量为m
  32. 费用为bugs的数量, 价值为brain的数量
  33. 对于每个洞穴,选或者不选
  34. 这个洞穴要选,当且仅当父亲被选
  35. */
  36. bool vis[N];
  37. int m;
  38. void dfs(int u, int fa)
  39. {
  40. vis[u] = true;
  41. int t = (cave[u].bugs+)/;
  42. for(int i=t; i<=m; ++i)
  43. dp[u][i] = cave[u].brain;
  44. for(int i=head[u]; i!=-; i=g[i].next)
  45. {
  46. int v = g[i].v;
  47. if(vis[v]) continue;
  48. dfs(v,u);
  49. for(int j=m; j>=t; --j)//必须从后往前推??? 由转移方程可以看出,前面的状态依赖于后面的状态,所以要求出后面的状态
  50. for(int k=; k+j<=m; ++k)//所有可能的情况都要枚举,然后求出最大值
  51. dp[u][j+k] = max(dp[u][j+k],dp[u][j]+dp[v][k]);
  52.  
  53. }
  54. }
  55. void init(int n)
  56. {
  57. for(e=; e<=n; ++e)
  58. {
  59. head[e] = -;
  60. vis[e] = false;
  61. }
  62. e = ;
  63. }
  64. void addEdge(int u, int v)
  65. {
  66. g[e].v = v;
  67. g[e].next = head[u];
  68. head[u] = e++;
  69. }
  70. int main()
  71. {
  72. int n,i,u,v;
  73. while(scanf("%d%d",&n,&m),n!=-)
  74. {
  75. init(n);
  76. for(i=; i<=n; ++i)
  77. scanf("%d%d",&cave[i].bugs,&cave[i].brain);
  78. for(i=; i<n; ++i)
  79. {
  80. scanf("%d%d",&u,&v);
  81. addEdge(u,v);
  82. addEdge(v,u);
  83. }
  84. if(m==)
  85. {
  86. puts("");
  87. continue;
  88. }
  89. memset(dp,,sizeof(dp));
  90. dfs(,-);
  91. printf("%d\n",dp[][m]);
  92. }
  93. return ;
  94. }

样例:

hdu1011(树形背包)的更多相关文章

  1. poj2486Apple Tree[树形背包!!!]

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9989   Accepted: 3324 Descri ...

  2. cdoj 1136 邱老师玩游戏 树形背包

    邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...

  3. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  4. poj 1155 TELE (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...

  5. bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...

  6. [HAOI2015]树上染色(树形背包)

    有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之间的距离加 ...

  7. Luogu 1273 有线电视网 - 树形背包

    Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移. Code #include<cstring> #include<cstdio> ...

  8. BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包

    分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ...

  9. [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序

    分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...

  10. BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜

    传送门 BZOJ 2427 题解 Tarjan把环缩成点,然后跑树形背包即可. 我用的树形背包是DFS序上搞的那种. 要注意dp数组初始化成-INF! 要注意dp顺推的时候也不要忘记看数组是否越界! ...

随机推荐

  1. VC 实现视图区背景颜色渐变填充

    void CSTest1View::OnDraw(CDC* pDC) { CSTest1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO:  ...

  2. Tokyo Tyrant(TTServer)系列(四)-tcrmgr远程管理与调试

    Tokyo Tyrant(TTServer)系列-tcrmgr(远程管理与调试) tcrmgr是TokyoTyrant的管理工具,对ttserver进行管理与执行命令: 通过输入tcrmgr回车,能够 ...

  3. 打印class文件的Java编译器内部的版本号

    当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误.错误信息如下 : Unsupported major.minor version 50 ...

  4. 14.4.3.6 Fine-tuning InnoDB Buffer Pool Flushing 微调 InnoDB Buffer Pool 刷新:

    14.4.3.6 Fine-tuning InnoDB Buffer Pool Flushing 微调 InnoDB Buffer Pool 刷新: innodb_flush_neighbors an ...

  5. js封装的类似java StringBuilder类

    使用js的时候,经常会使用字符串拼接,但是在IE6和IE7没有对+作优化,所以性能会很低,鉴于此,我封装了StringBuilder类,用于拼接字符串,直接把代码贴出来如下: function Str ...

  6. jQuery 自学笔记—9 常见特效 (终章)

    隐藏.显示.切换,滑动,淡入淡出,以及动画 效果演示 点击这里,隐藏/显示面板 一寸光阴一寸金,因此,我们为您提供快捷易懂的学习内容. 在这里,您可以通过一种易懂的便利的模式获得您需要的任何知识. 实 ...

  7. ISO/OSI网络体系结构和TCP/IP协议模型

    1. ISO/OSI的参考模型共有7层,由低层至高层分别为:物理层.数据链路层.网络层.传输层.会话层.表示层.     应用层.各层功能分别为: (1)物理层          提供建立.维护和拆除 ...

  8. 使用函数指针和多态代替冗长的if-else或者switch-case

    在编程中,if-else和switch-case是很常见的分支结构,很少在程序中不用这些控制语句.但是不能否认,在一些场景下,由于分支结构过分长,导致代码不美观且不容易维护,在<重构>一书 ...

  9. jconsole 连接 eclipse启动项目

    eclipse 启动java项目默认没有开启jmx远程查看功能,假设须要看项目执行的线程内存使用量等信息,能够在eclipse启动參数中添加: -Dcom.sun.management.jmxremo ...

  10. dedecms 文章列表和频道列表同时调用

    演示效果:http://www.mypf110.com/qcd/ <div class="changshi_wrap"> {dede:channelartlist ro ...