题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1561

题目大意:从树根开始取点。最多取m个点,问最大价值。

解题思路

cost=1的树形背包。

有个虚根0,取这个虚根也要cost,所以最后的结果是dp[0][m+1]。

本题是cost=1的特殊背包问题,在两个for循环上有一个优化。

for(f+1...j....cost)

for(1....k...j-cost)

其中f为当前已经dfs子结点个数。之所以+1,是因为根要预留一个空间。

f+=dfs(t),dfs(t)返回的是子点t的f+1。

其实可以直接把f+1写成m+1, 不过要多好多次没必要的循环。

  1. #include "cstdio"
  2. #include "vector"
  3. #include "cstring"
  4. using namespace std;
  5. #define maxn 205
  6. int n,m,u,dp[maxn][maxn],w[maxn],head[maxn],tol;
  7. struct Edge
  8. {
  9. int to,next;
  10. }e[maxn];
  11. void addedge(int u,int v)
  12. {
  13. e[tol].to=v;
  14. e[tol].next=head[u];
  15. head[u]=tol++;
  16. }
  17. int dfs(int root)
  18. {
  19. int i=root,cost=,f=;
  20. for(int i=cost;i<=m;i++) dp[root][i]=w[root];
  21. if(head[root]==-) return ;
  22. for(int a=head[root];a!=-;a=e[a].next)
  23. {
  24. int t=e[a].to;
  25. f+=dfs(t);
  26. for(int j=f+;j>=;j--)
  27. {
  28. for(int k=;k<=j-cost;k++)
  29. {
  30. dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[t][k]);
  31. }
  32. }
  33. }
  34. return f+;
  35. }
  36. int main()
  37. {
  38. //freopen("in.txt","r",stdin);
  39. while(scanf("%d%d",&n,&m)&&n&&m)
  40. {
  41. memset(head,-,sizeof(head));
  42. tol=;
  43. for(int i=;i<=n;i++)
  44. {
  45. scanf("%d%d",&u,&w[i]);
  46. addedge(u,i);
  47. }
  48. dfs();
  49. printf("%d\n",dp[][m+]);
  50. memset(dp,,sizeof(dp));
  51. }
  52. }
11910646 2014-10-19 14:01:53 Accepted 1561 0MS 400K 1099 B C++ Physcal

HDU 1561 (树形DP+背包)的更多相关文章

  1. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 1561 树形DP(入门)

    题目链接:  HDU 1561 The more, The Better #include <iostream> #include <cstdio> #include < ...

  3. hdu 1011 树形dp+背包

    题意:有n个房间结构可看成一棵树,有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间有一定的敌人,每个士兵可以对抗20个敌人,士兵在某个房间对抗敌人使无法走开,同时有一个价值,问你花费这m个士 ...

  4. hdu 1561 树形dp+分组背包

    题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...

  5. HDU 4003 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...

  6. HDU 1011 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1011 题目大意:树上取点,先取父亲,再取儿子.每个点,权为w,花费为cost,给定m消费总额,求最大 ...

  7. hdu 1561(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路:dp[u][i]表示以u为根的树选了i个子节点. #include<iostream ...

  8. HDU 1561 树形DP背包问题

    这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲 自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的 题目大意是: 攻克m个城市,每 ...

  9. hdu 1561 树形DP n个选m个价值最大

    http://acm.hust.edu.cn/vjudge/problem/18068 #include <iostream> #include <string> #inclu ...

随机推荐

  1. SQL注入--宽字节注入

    PHP测试代码: <?php // 面向对象写法 $id=addslashes($_GET[‘id’]); //获取id并转义预定义字符 // /$id=$_GET[‘id’]; $mysqli ...

  2. Aptana插件安装到eclipse和myeclipse的详细过程

    刚开始学习Jquery,为了搭建好的环境是很重要的,所以我尝试了很多方式,下面之一. 一.要下载好Aptana 插件 官网: http://update1.aptana.org/studio/3.2/ ...

  3. Nmap备忘单:从探索到漏洞利用(Part 2)

    这是我们的第二期NMAP备忘单(第一期在此).基本上,我们将讨论一些高级NMAP扫描的技术,我们将进行一个中间人攻击(MITM).现在,游戏开始了. TCP SYN扫描 SYN扫描是默认的且最流行的扫 ...

  4. HDU 1708 简单dp问题 Fibonacci String

    Fibonacci String Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. poj2485 Highways

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...

  6. SublimeText3 生成html标签快捷键

    mmet Documentation Syntax Child: > nav>ul>li <nav> <ul> <li></li> & ...

  7. 【Python】python代码如何调试?

    Python 程序如何高效地调试? 现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位 ...

  8. poj 1833

    http://poj.org/problem?id=1833 next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序: 当排 ...

  9. Linux set env export declare unset

    http://www.it165.net/os/html/201405/8390.html env /etc/profile 环境变量 系统提供 可改 set /etc/bashrc及用户自定义的变量 ...

  10. java回顾巩固

    看视频复习java有一段时间了.虽然现在做的东西是net的,但是一直没忘记复习java. 更多的大概在这里. java变量的命名规则: (A)组成规则: 1:英文大小写字母 2:数字 3:$和_ (2 ...