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