题目

给一棵n 个结点的有根树,结点由1 到n 标号,根结点的标号为1。每个结点上有一个物品,第i 个结点上的物品价值为vi。

你需要从所有结点中选出若干个结点,使得对于任意一个被选中的结点,其到根的路径上所有的点都被选中,并且选中结点的个数不能超过给定的上限lim。在此前提下,你需要最大化选中结点上物品的价值之和。

求这个最大的价值之和。

分析

设\(f_{i,j}\)表示在以i为根的子树中,选了j个节点(当j>0时,i节点必选)。

转移就显然了,对于每个节点,与它的每个儿子分别做背包,

有个优化,对于以节点i为根的子树中,假设这个子树有sum个节点,那么当j>sum时,就可以break。

  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <queue>
  8. const int maxlongint=2147483647;
  9. const int mo=1000000007;
  10. const int N=3005;
  11. using namespace std;
  12. int f[N][N],n,m,next[N*2],last[N*2],to[N*2],val[N*2],tot,sum[N*2];
  13. int bj(int x,int y)
  14. {
  15. next[++tot]=last[x];
  16. last[x]=tot;
  17. to[tot]=y;
  18. }
  19. int dg(int x,int fa)
  20. {
  21. sum[x]=1;
  22. f[x][0]=0;
  23. for(int i=last[x];i;i=next[i])
  24. if(to[i]!=fa)
  25. {
  26. dg(to[i],x);
  27. sum[x]+=sum[to[i]];
  28. }
  29. int mn=min(sum[x],m);
  30. for(int i=1;i<=mn;i++)
  31. f[x][i]=val[x];
  32. for(int i=last[x];i;i=next[i])
  33. {
  34. int j=to[i];
  35. if(j!=fa)
  36. for(int k=mn;k>=1;k--)
  37. for(int l=0;k+l<=mn;l++)
  38. {
  39. f[x][k+l]=max(f[x][k+l],f[j][l]+f[x][k]);
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. scanf("%d%d",&n,&m);
  46. for(int i=1;i<=n;i++)
  47. scanf("%d",&val[i]);
  48. for(int i=1;i<=n-1;i++)
  49. {
  50. int x,y;
  51. scanf("%d%d",&x,&y);
  52. bj(x,y);
  53. bj(y,x);
  54. }
  55. dg(1,0);
  56. int ans=0;
  57. for(int i=1;i<=m;i++)
  58. ans=max(ans,f[1][i]);
  59. cout<<ans;
  60. }

【NOIP2016提高A组五校联考2】tree的更多相关文章

  1. NOIP2016提高A组五校联考4总结

    坑爹的第一题,我居然想了足足3个小时,而且还不确定是否正确. 于是,我就在这种情况下心惊胆跳的打了,好在ac了,否则就爆零了. 第二题,树形dp,本来差点就想到了正解,结果时间不够,没打完. 第三题, ...

  2. 【NOIP2016提高A组五校联考4】square

    题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\ ...

  3. 【NOIP2016提高A组五校联考4】label

    题目 题目 20%算法 设\(f_{i,j}\)表示第i个节点选了j这个权值的方案数. 显然转移方程为,\[f_{i,j}=\Pi_{v=son(i)}(\sum_{k=1}^{j-k}f_{v,k} ...

  4. 【NOIP2016提高A组五校联考4】ksum

    题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子 ...

  5. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  6. 【NOIP2016提高A组五校联考2】running

    题目 小胡同学是个热爱运动的好孩子. 每天晚上,小胡都会去操场上跑步,学校的操场可以看成一个由n个格子排成的一个环形,格子按照顺时针顺序从0 到n- 1 标号. 小胡观察到有m 个同学在跑步,最开始每 ...

  7. 【NOIP2016提高A组五校联考2】string

    题目 给出一个长度为n, 由小写英文字母组成的字符串S, 求在所有由小写英文字母组成且长度为n 且恰好有k 位与S 不同的字符串中,给定字符串T 按照字典序排在第几位. 由于答案可能很大,模10^9 ...

  8. NOIP2016提高A组五校联考2总结

    第一题用组合数各种乱搞,其恶心程度不一般.搞了很久才调对,比赛上出了一点bug,只拿了30分. 第二题我乱搞得出个错误的结论,本来自信满满60分,结果爆零了. 第三题,树形dp,在一开始的时候想到了, ...

  9. NOIP2016提高A组五校联考1总结

    第一题二分,在比赛上明明想到的方法,结果考虑的时候似乎漏了什么,被否决掉了. 只打了个水法,10分. 第二题,最长不上升子序列,原题,类似的题目做过两道,直接搞定. 第三题,一开始想了一种通过在树上打 ...

随机推荐

  1. SQLALchemy如何查询mysql某个区间内的数据

    查了下,找到3种方式: 方法一注意时间格式:xxxx-xx-xx 方法二没有‘day’ 方法三的时间格式同方法一 1.result = Jobs.query.filter(Jobs.create_ti ...

  2. Flume采集日志

    角色 Source 数据来源 (exec, kafka, http…)Channel 数据通道 (memory,file,jdbc)Sink 数据目的地 (kafka,hdfs,es…) Agent ...

  3. python学习之面向对象(三)

    6.8 类的结构细化 6.8.1 类的私有成员 类中的私有成员包括:私有类的属性,私有对象属性,私有类方法 私有静态属性 类的内部可以访问,类的外部不可以访问,派生类中不可以访问 class A: _ ...

  4. 病毒分析(三)-利用Process Monitor对熊猫烧香病毒进行行为分析

    前两次随笔我介绍了手动查杀病毒的步骤,然而仅通过手动查杀根本无法仔细了解病毒样本的行为,这次我们结合Process Monitor进行动态的行为分析. Process Monitor Process ...

  5. 【VS开发】【智能语音处理】Windows下麦克风语音采集

    简介 这是我很早以前的大学毕业设计,忽然间找到贴出来以纪念自己的纯真年代...但是因为CSDN不给面子所以导致短短的一篇文章贴了足足7次..他老提时说文章超过了64K,老大,拜托,那是算上了里面的图片 ...

  6. ef Migration 的一些基础命令

    cmd ci 命令 dotnet ef migrations add NewColum --新增migrations dotnet ef database update--跟新数据库 dotnet e ...

  7. ElasticSearch Kibana 创建索引,删除索引,查看索引配置

    1.输入命令,点击绿色的三角形箭头. PUT chuyuan  //创建索引 GET chuyuan/_settings  //查看chuyuan索引下的配置 GET _all/_settings   ...

  8. 学习Linux第一周记

    2019/11/25 服务器硬件详述1) CPU                         作用:运算/控制      关注信息 :路数 服务器中CPU的颗数   一般有  (单路    双路  ...

  9. Linux中安装配置KVM虚拟化

    KVM 概述: KVM 即 Kernel-based Virtual Machine 基于内核的虚拟机. KVM,是一个开源的系统虚拟化模块,自 Linux 2.6.20 之后集成在 Linux 的各 ...

  10. poj2352(树状数组)

    题目链接:https://vjudge.net/problem/POJ-2352 题意:在直角坐标系中给出n个点的 (x,y),(0<=x,y<=32000),定义每个点的level为(x ...