题目

分析

又是一个显然的树形依赖背包

然而可以 \(O(nm)\) 依靠 \(dfs\) 序来 \(dp\)

\(Code\)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int N = 2005;
int v[N] , p[N] , f[N][10005] , n , m , tot , h[N] , dfn[N] , dfc , siz[N];
struct edge{
int to , nxt;
}e[N * 2 + 5]; void add(int x , int y){e[++tot] = edge{y , h[x]} , h[x] = tot;}
void dfs(int x , int fa)
{
dfn[++dfc] = x , siz[x] = 1;
for(register int i = h[x]; i; i = e[i].nxt)
{
int y = e[i].to;
if (y == fa) continue;
dfs(y , x);
siz[x] += siz[y];
}
} int main()
{
scanf("%d%d" , &n , &m);
int x , y;
for(register int i = 1; i <= n; i++) scanf("%d%d" , &v[i] , &p[i]);
for(register int i = 1; i < n; i++) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
dfs(1 , 0);
for(register int i = n; i >= 1; i--)
for(register int j = m; j >= 0; j--)
{
if (j >= p[dfn[i]]) f[i][j] = max(f[i][j] , f[i + 1][j - p[dfn[i]]] + v[dfn[i]]);
f[i][j] = max(f[i][j] , f[i + siz[dfn[i]]][j]);
}
printf("%d" , f[1][m]);
}

最新文章

  1. 利用Bootstrap快速搭建个人响应式主页(附演示+源码)
  2. AC日记——约瑟夫问题 codevs 1282
  3. SHOI 2009 会场预约 平衡树 STL练习
  4. GsonUtils.java
  5. android 项目学习随笔十五(ShareSDK开放平台)
  6. js parseInt();parseFloat;Number()
  7. GO简易聊天系统后台源码分享
  8. win7共享wifi
  9. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能
  10. Codeforces Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分,贪心
  11. NGUI 按钮音效问题
  12. Android全局异常捕捉
  13. MFC对话框中显示背景图片
  14. 开源的JavaScript插件化框架MinimaJS
  15. RabbitMQ使用详解
  16. JS sort() 方法
  17. 解决Tomcat端口被占用 及 启用失败等其它错误整理册
  18. 【ORACLE】ID 2299494.1 安装Oracle 11g 86%报错:Error in invoking target &#39;agent nmhs&#39; of makefile
  19. 20181016-4 Alpha阶段第1周/共2周 Scrum立会报告+燃尽图 02
  20. Spring管理过滤器:org.springframework.web.filter.DelegatingFilterProxy

热门文章

  1. JavaEE Day02MySQL
  2. 【Java技术】String类的使用
  3. C#11新特性-Raw string literals原始字符串研究、示例
  4. 安装aio-pika报错
  5. python 错误之TypeError: XXXXX() takes no keyword arguments
  6. python 实现RSA公钥加密,私钥解密
  7. Ajax---EventLoop事件循环
  8. 远程登录到Linux服务器
  9. BFS广度优先搜索例题分析
  10. 连号区间数【第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组】