http://acm.hdu.edu.cn/showproblem.php?pid=1011

 
题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被清空时,才可以清扫它          的子节点,而清扫需要一定的人员。给定M个人员,N个结点的树,求最大brain和
 
这看起来是一道非常简单的背包dp
但是
写完提交wa之后,我发现这道题,并不简单!因为他的题意并不是完全和我找到的题意一样(我承认我语文很差劲所以随便找个题解看题意。。),题目中要求每一个人是不能往回走的,所以节点bug值为0时也不能随意收集brain,一个人员只能收集一条链。当然0个人的时候不管怎么样都收集不到brain直接特判。
这个问题可以通过一个非常之骚的操作解决,操作如下
f[a][b]代表以a点为根的子树布置b个人能得到的最大brain的和
  1. for(int k=m;k>=bu[x];k--){
  2. for(int j=;j+k<=m;j++){//注意这个地方从1开始
  3. f[x][k+j]=max(f[x][k+j],f[x][k]+f[y][j]);
  4. }
  5. }

j从1开始循环完美避免了不给下面的路分配人却得到brain值的事情发生,然后就可以ac了。。。

但是并没有ac。。为什么呢。。。因为我,没有把写好的清空数据函数放到主程序里。。。

然后我wa了8次。。。引以为戒。
代码:
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const int maxn=;
  8. const double eps=1e-;
  9. const int modn=;
  10. int n,m;
  11. struct nod{
  12. int next,y;
  13. }e[maxn*];
  14. int bu[maxn]={},bra[maxn]={},head[maxn]={},tot=;
  15. bool vis[maxn]={};
  16. int f[maxn][maxn]={};
  17. void init(int x,int y){
  18. e[++tot].y=y;
  19. e[tot].next=head[x];
  20. head[x]=tot;
  21. }
  22. void dfs(int x){
  23. vis[x]=;
  24. int y;
  25. for(int i=bu[x];i<=m;i++){
  26. f[x][i]=bra[x];
  27. }
  28. for(int i=head[x];i;i=e[i].next){
  29. y=e[i].y;
  30. if(!vis[y]){
  31. dfs(y);
  32. for(int k=m;k>=bu[x];k--){
  33. for(int j=;j+k<=m;j++){
  34. f[x][k+j]=max(f[x][k+j],f[x][k]+f[y][j]);
  35. }
  36. }
  37. }
  38. }
  39. }
  40. void yu(){
  41. tot=;memset(f,,sizeof(f));
  42. memset(head,,sizeof(head));
  43. memset(vis,,sizeof(vis));
  44. }
  45. int main(){
  46. for(;;){
  47. yu();
  48. scanf("%d%d",&n,&m);
  49. if(n==-||m==-){
  50. break;
  51. }
  52. for(int i=;i<=n;i++){
  53. scanf("%d%d",&bu[i],&bra[i]);
  54. bu[i]=(bu[i]+)/;
  55. }
  56. int x,y;
  57. for(int i=;i<n;i++){
  58. scanf("%d%d",&x,&y);
  59. init(x,y);init(y,x);
  60. }
  61. if(m==){
  62. printf("0\n");
  63. continue;
  64. }
  65. dfs();
  66. printf("%d\n",f[][m]);
  67. }
  68. return ;
  69. }

HDU 1011 Starship Troopers 树形+背包dp的更多相关文章

  1. hdu 1011 Starship Troopers 树形背包dp

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  2. hdu 1011 Starship Troopers(树形背包)

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. hdu 1011 Starship Troopers(树形DP入门)

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. hdu 1011 Starship Troopers(树上背包)

    Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. Th ...

  5. [HDU 1011] Starship Troopers (树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 dp[u][i]为以u为根节点的,花了不超过i元钱能够得到的最大价值 因为题目里说要访问子节点必 ...

  6. HDU 1011 Starship Troopers 树形DP 有坑点

    本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...

  7. 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 ...

  8. hdu 1011(Starship Troopers,树形dp)

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  9. hdu 1011 Starship Troopers 经典的树形DP ****

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. CodeForces - 1004C

    Since Sonya is interested in robotics too, she decided to construct robots that will read and recogn ...

  2. 绿色的宠物店cms后台管理系统模板——后台

    链接:http://pan.baidu.com/s/1c7qmsA 密码:2es8

  3. 某线下赛AWD

    拿别人比赛的来玩一下,或许这就是菜的力量吧. 0x01 任意文件读取: switch ($row['media_type']) { case 0: // 图片广告 ...... break; case ...

  4. 64_p6

    polkit-kde-5.10.1-1.fc26.x86_64.rpm 12-Jun-2017 13:45 84854 polkit-libs-0.113-8.fc26.i686.rpm 13-Apr ...

  5. MySQL创建相同表和数据命令

    创建和表departments结构和数据一样的表departments_t mysql> create table departments_t like departments; Query O ...

  6. 135.Candy---贪心

    题目链接 题目大意:分糖果,每个小朋友都有一个ratings值,且每个小朋友至少都要有一个糖果,而且每个小朋友的ratings值如果比左右邻舍的小朋友的ratings值高,则其糖果数量也比邻舍的小朋友 ...

  7. 设计模式之笔记--职责链模式(Chain of Responsibility)

    职责链模式(Chain of Responsibility) 定义 职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 ...

  8. Python抽象类和接口类

    一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...

  9. linux系统cpu使用100%的命令

    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...

  10. Vue.js——60分钟快速入门(转)

    var vm = new Vue({ el: '#app', data: { people: [{ name: 'Jack', age: 30, sex: 'Male' }, { name: 'Bil ...