vj链接:https://vjudge.net/contest/367007#problem/G

题意:

给你一棵树,树上有n个节点,每一个节点有一个权值,树根节点是1,你需要找到以1为起点连通的m个点的最大的权值(连通的意思也就是:这m个点在从1点遍历树的时候,有这样的一个序列)

题解:

dp[x][i]表示:以x为起点,连通量为i的最大权值

dp转移方程:

for(int i=m;i>1;--i)  //因为每一个节点只能用一次,所以要像01背包一样循环
{
for(int j=0;j<i;++j)
{
dp[x][i]=max(dp[x][i],dp[x][i-j]+dp[v][j]); //v就是这条边的终点
}
}

因为我们要求dp[1][m]所以我们要先找到子树节点的dp值,然后由子树结点的值去求出来根节点的最优值

这个dp的过程也类似于背包容量为m的01背包

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<math.h>
6 #include<vector>
7 #include<queue>
8 #include<stack>
9 #include<map>
10 using namespace std;
11 typedef long long ll;
12 const int maxn=105;
13 const int INF=0x3f3f3f3f;
14 const double eps=1e-8;
15 const double PI=3.1415926;
16 const int mod = 1e9+7;
17 int val[maxn],dp[maxn][maxn];
18 int n,m;
19 vector<int>w[maxn];
20 void dfs(int x,int pre) //x代表起点
21 {
22 dp[x][1]=val[x];
23 for(int i=0;i<w[x].size();++i) //这个相当于背包dp枚举物品那一层for循环
24 {
25 int v=w[x][i];
26 if(v!=pre)
27 {
28 dfs(v,x);
29 for(int i=m;i>1;--i) //因为每一个节点只能用一次,所以要像01背包一样循环
30 {
31 for(int j=0;j<i;++j)
32 {
33 dp[x][i]=max(dp[x][i],dp[x][i-j]+dp[v][j]);
34 }
35 }
36 }
37 }
38 }
39 int main()
40 {
41 scanf("%d%d",&n,&m);
42 for(int i=1;i<=n;++i)
43 scanf("%d",&val[i]);
44 for(int i=1;i<n;++i)
45 {
46 int x,y;
47 scanf("%d%d",&x,&y);
48 w[x].push_back(y);
49 w[y].push_back(x);
50 }
51 dfs(1,0);
52 printf("%d\n",dp[1][m]);
53 return 0;
54 }

最新文章

  1. ***Linux下使用git命令及github项目
  2. ubuntu下安装了express2.5.8,如何更新它?
  3. javascript学习笔记1-document.write
  4. CLR via C#(15)--String,熟悉而又陌生
  5. HDU 5452 Minimum Cut
  6. (2015年郑州轻工业学院ACM校赛题) A 彩票
  7. Permutations,Permutations II,Combinations
  8. sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following
  9. OpenCV3.0.0+win10 64位+vs2015环境的下载,安装,配置
  10. 取得GridView某行的DataKey
  11. Linux 服务器设置成支持中文
  12. OSG嵌入QT(QT界面使用Qt Designer编辑)
  13. 美团分布式服务通信框架及服务治理系统OCTO
  14. JZ2440学习笔记之中断
  15. en-zh(社会问题)social problems-2
  16. 副本集mongodb 无缘无故 cpu异常
  17. ACM-ICPC 2018年北京网络赛 D-80 days
  18. [USACO09JAN]Earthquake Damage
  19. [shell] bash数组(for时排序)
  20. 配置tomcat全局c3p0连接池

热门文章

  1. 有了链路日志增强,排查Bug小意思啦!
  2. 【Git】2、Linux快速安装Git环境 & oh-my-zsh
  3. mysql的安全问题
  4. 【Linux】常用的Linux可插拔认证模块(PAM)应用举例:pam_limits.so、pam_rootok.so和pam_userdb.so模块
  5. ctfhub技能树—信息泄露—备份文件下载—.DS_Store
  6. 宝塔的url计划任务
  7. Eureka详解系列(一)--先谈谈负载均衡器
  8. linux下安装zsh和p10k的详细过程
  9. 一步步使用SpringBoot结合Vue实现登录和用户管理功能
  10. JVM重新认识(一)oop-klass模型--HSDB使用验证