1 # include<iostream>
2 # include<cstring>
3 # include<algorithm>
4 using namespace std;
5 const int N = 110;
6
7 int e[N], ne[N], idx;
8 int h[N];
9 int v[N], val[N];
10 int n, m;
11 int f[N][N];
12
13 void add(int a, int b) {
14 e[idx] = b;
15 ne[idx] = h[a];
16 h[a] = idx++;
17 }
18 void dfs(int u) {
19 for (int i = h[u]; ~i; i = ne[i]) /*循环子节点*/
20 {
21 int son = e[i];
22 dfs(e[i]);/*递归子节点*/
23
24 for (int j = m - v[u]; j >= 0; --j)/*循环体积*/
25 for (int k = 0; k <= j; ++k)/*循环决策*/
26 f[u][j] = max(f[u][j], f[u][j - k] + f[son][k]);
27 }
28 for (int i = m; i >= v[u]; i--) f[u][i] = f[u][i - v[u]] + val[u];
29 for (int i = 0; i < v[u]; ++i) f[u][i] = 0;
30 }
31
32 int main() {
33 cin >> n >> m;
34 int root;/*根节点*/
35 memset(h,-1,sizeof h);/*初始化头结点*/
36 for (int i = 1; i <= n; ++i) {
37 int c;
38 cin >> v[i] >> val[i] >> c;
39 if (c == -1) root = i;
40 else add(c, i);
41 }
42
43 dfs(root);
44
45 cout << f[root][m] << endl;
46 return 0;
47 }

f[u][j]表示在根节点为u,体积为j的情况下的最大价值

树形结构的dp问题,重点在于理解在树形结构的决策选择

因为题目限制只要选择子节点,那么头结点必须选择,所以在循环体积的时候,因为是对于子节点进行循环体积

所以要求要在体积上为父节点的体积预留位置,所以才有:

for (int  j = m - v[u](这一步就是在为父节点预留体积); j >= 0; --j)

而在后续的的过程中,因为在递归字节的时候为父节点预留了体积,所以在结束对子节点的递归后
需要把之前预留的位置将父节点的信息加进去,也就是:
for (int i = m; i >= v[u]; i--) f[u][i] = f[u][i - v[u]] + val[u];
  对于之前预留的体积将父节点的信息加入进去,

for (int i = 0; i < v[u]; ++i) f[u][i] = 0;
因为只要选择子节点就需要选择父节点,所以对于小于父节点的部分在决策中是绝对选择不到的
这就需要将其价值清0

 

有依赖的背包问题(Acwing 10)的更多相关文章

  1. luoguP1064 金明的预算方案 (有依赖的背包问题)

    题目链接:https://www.luogu.org/problemnew/show/P1064 这是一个有依赖的背包问题,属于01背包的变式.这题还好,每个主件最多有2个附件,那么在对主件进行背包的 ...

  2. AcWing 10. 有依赖的背包问题

    #include <cstring> #include <iostream> #include <algorithm> using namespace std; ; ...

  3. NOIP2006金明的预算方案[DP 有依赖的背包问题]

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  4. 洛谷 P1064 金明的预算方案(有依赖的背包问题)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  5. hdu3449 有依赖的背包问题

    题意:       给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对 ...

  6. 题解【AcWing10】有依赖的背包问题

    题面 树形 DP 的经典问题. 我们设 \(dp_{i,j}\) 表示当前节点为 \(i\),当前节点的子树(包含当前节点)最多装的体积是 \(j\) 的最大价值. 我们遍历节点的过程就相当于做了一遍 ...

  7. 【dp】 背包问题

    问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...

  8. WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)

    一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期 ...

  9. ubuntu15.10 安装 virtualbox5.0

    首先安装依赖包.ubuntu15.01安装的时候会出现这个错误: virtualbox-); however: Package libvpx1 is not installed 而且sudo apt- ...

随机推荐

  1. 十周周末总结 MySQL的介绍与使用

    python 十周周末总结 MySQL的介绍与使用 MySQL字符编码与配置文件 查看数据库的基本信息(用户,字符编码) /s windos下MySQL默认的配置文件 my_default.ini 修 ...

  2. vscode 插件 Cnblogs Client For VSCode

    目录 简介 主要功能 登录 / 授权 将本地 markdown 文件发布到博客园 博客园博文列表 将本地文件关联到博客园博文 拉取远程博文内容更新本地文件 图片上传 博文分类管理 导出 pdf 博文设 ...

  3. 【NOI P模拟赛】最短路(树形DP,树的直径)

    题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...

  4. 配置IConfiguration

    前言 配置是我们必不可少的功能,我们在开发中,经常会遇到需要获取配置信息的需求,那么如何才能优雅的获取配置信息? 我们希望新的配置: 支持强类型 配置变更后通知 学习难度低 快速入门 根据使用场景我们 ...

  5. ViewGroup事件分发源码分析

    1.AndroidStudio源码调试方式 AndroidStudio默认是支持一部分源码调试的,但是build.gradle(app) 中的sdk版本要保持一致, 最好是编译版本.运行版本以及手机的 ...

  6. MFRC522学习笔记

    MFRC522主要特性 容量为8K位(bits)=1K字节(bytes)EEPROM 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位 每个扇区有独立的一组密码及访问控制 每张卡有唯一序 ...

  7. 关于MicroPython mpremote工具 的一些用例,闲聊

    关于MicroPython mpremote工具 的一些用例,闲聊 我尝试了很多不同的第三方micropython工具,有些是Windows应用程序,有些是VScode插件. 但是当我尝试过Micro ...

  8. [第二章 web进阶]XSS闯关-1

    定义:跨站脚本(Cross_Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户浏览网 ...

  9. AlertManager企业微信报警,时间是UTC时间,错8个小时的两种解决办法

    第一种 {{ (.StartsAt.Add 28800e9).Format "2020-01-02 15:04:05" }} 或者是 {{ ($alert.StartsAt.Add ...

  10. MySQL集群搭建(5)-MHA高可用架构

    1 概述 1.1 MHA 简介 MHA - Master High Availability 是由 Perl 实现的一款高可用程序,出现故障时,MHA 以最小的停机时间(通常10-30秒)执行 mas ...