有依赖的背包问题(Acwing 10)
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)的更多相关文章
- luoguP1064 金明的预算方案 (有依赖的背包问题)
题目链接:https://www.luogu.org/problemnew/show/P1064 这是一个有依赖的背包问题,属于01背包的变式.这题还好,每个主件最多有2个附件,那么在对主件进行背包的 ...
- AcWing 10. 有依赖的背包问题
#include <cstring> #include <iostream> #include <algorithm> using namespace std; ; ...
- NOIP2006金明的预算方案[DP 有依赖的背包问题]
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案(有依赖的背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- hdu3449 有依赖的背包问题
题意: 给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对 ...
- 题解【AcWing10】有依赖的背包问题
题面 树形 DP 的经典问题. 我们设 \(dp_{i,j}\) 表示当前节点为 \(i\),当前节点的子树(包含当前节点)最多装的体积是 \(j\) 的最大价值. 我们遍历节点的过程就相当于做了一遍 ...
- 【dp】 背包问题
问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...
- WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)
一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期 ...
- ubuntu15.10 安装 virtualbox5.0
首先安装依赖包.ubuntu15.01安装的时候会出现这个错误: virtualbox-); however: Package libvpx1 is not installed 而且sudo apt- ...
随机推荐
- 基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints
大家好,我是等天黑. FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架,它可以很好地替代 .NET Minimal APIs 和 MVC ,专门为开发效率而生,带来 ...
- RabbitMQ协议-AMQP 0-9-1 (高级消息队列协议)
工作模型 producer:生产者 Connection:TCP长连接,AMQP 0-9-1 连接通常是长期存在的.AMQP 0-9-1 是一个应用层协议,它使用 TCP 进行可靠传输.连接使用身份验 ...
- 【java】学习路径37-练习:任意文件的复制
使用字节完成复制 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException ...
- HTTP协议,会话跟踪,保存作用域,servlet类跳转
解决post的编码问题,防止中文乱码 request.setCharacterEncoding("utf-8"); HTTP协议: (1)由Request(请求)和Response ...
- 第九十五篇:vue-router的导航守卫
好家伙,考完期末考了. 恢复博客更新 1.什么是导航守卫? "导航"表示路由正在发生变化 设置导航,就在切换过程中进行限制 "守卫"就好理解了 盯着你,不然 ...
- KingbaseES rownum 与 limit 的 执行计划区别
数据准备 --创建基础数据表100W行 create table test07 as select * from (select generate_series(1, 1000000) id, (ra ...
- 银河麒麟v4_sp4安装英伟达驱动
bios设置视频输出为auto模式 视频线插独立显卡上 先dpkg 安装两个deb包 1.禁用开源驱动:sudo vim /etc/modprobe.d/blacklist.conf,在里面添加 bl ...
- 关于 JavaScript 中 null 的一切
原文地址:Everything about null in JavaScript 原文作者:Dmitri Pavlutin 译者:Gopal JavaScript 有两种类型:原始类型(strings ...
- 《网页设计基础——CSS的四种引入方式详解》
网页设计基础--CSS的四种引入方式详解 一.行内式: 规则: 1. 行内式是所有样式方法中最为直接的一种,它直接对HTML的标记使用style属性,然后将CSS代码直接写在其中. 格 ...
- HK32F030MF4P6的Linux GCC工具链和VSCode开发环境
HK32F030MF4P6简介 航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有 ...