题解【AcWing10】有依赖的背包问题
树形 DP 的经典问题。
我们设 \(dp_{i,j}\) 表示当前节点为 \(i\),当前节点的子树(包含当前节点)最多装的体积是 \(j\) 的最大价值。
我们遍历节点的过程就相当于做了一遍分组背包。
注意遍历完所有子节点后要更新一下状态。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 103;
int n, m;
int tot, head[maxn], ver[maxn * 2], nxt[maxn * 2];
int dp[maxn][maxn];
int v[maxn], w[maxn], p[maxn];
inline void add(int u, int v)
{
ver[++tot] = v, nxt[tot] = head[u], head[u] = tot;
}
void dfs(int u, int f)
{
for (int i = head[u]; i; i = nxt[i]) //循环组数
{
int vv = ver[i];
if (vv == f) continue;
dfs(vv, u); //遍历子节点
for (int j = m - v[u]; j >= 0; j-=1) //循环体积
for (int k = 0; k <= j; k+=1) //循环决策
dp[u][j] = max(dp[u][j], dp[u][j - k] + dp[vv][k]); //状态转移
}
//更新状态
for (int i = m; i >= v[u]; i-=1) dp[u][i] = dp[u][i - v[u]] + w[u];
for (int i = 0; i < v[u]; i+=1) dp[u][i] = 0;
}
int main()
{
cin >> n >> m;
int rt = -1; //根节点
for (int i = 1; i <= n; i+=1)
{
cin >> v[i] >> w[i] >> p[i];
if (p[i] == -1) rt = i;
else add(i, p[i]), add(p[i], i); //建树
}
dfs(rt, 0);
cout << dp[rt][m] << endl;
return 0;
}
题解【AcWing10】有依赖的背包问题的更多相关文章
- luoguP1064 金明的预算方案 (有依赖的背包问题)
题目链接:https://www.luogu.org/problemnew/show/P1064 这是一个有依赖的背包问题,属于01背包的变式.这题还好,每个主件最多有2个附件,那么在对主件进行背包的 ...
- NOIP2006金明的预算方案[DP 有依赖的背包问题]
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- AcWing 10. 有依赖的背包问题
#include <cstring> #include <iostream> #include <algorithm> using namespace std; ; ...
- hdu3449 有依赖的背包问题
题意: 给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对 ...
- 【题解】HEOI2013Eden 的新背包问题
这题真的神奇了……蜜汁复杂度(`・ω・´) 应该是一个比较连贯的思维方式:去掉一个物品,那么我们转移的时候不考虑它就好了呗.考虑暴力:每一次都对剩余的n - 1个物品进行多重背包转移,获得答案.既然可 ...
- 洛谷 P1064 金明的预算方案(有依赖的背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 有依赖的背包问题(Acwing 10)
1 # include<iostream> 2 # include<cstring> 3 # include<algorithm> 4 using namespac ...
- 【dp】 背包问题
问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...
- noip杂题题解
这道题没有什么可说的,先统计,然后几次快排,答案就出来了 Code(整齐但不简洁的代码) #include<iostream> #include<cstdio> #includ ...
随机推荐
- Android中ProgressBar的使用-通过Handler与Message实现进度条显示
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...
- Linux 使用vim命令编辑文件内容
在终端可以使用vim命令来直接编辑文件内容. vim,也可以叫做vi. vim有三种模式:命令模式.输入模式.底线命令模式. 命令模式 vim 文件名 进入命令模式,vim也可以写成vi. 如果 ...
- rhel加载raid卡驱动安装系统
有时候需要把系统安装到RAID上,但是系统本身又缺少该RAID卡驱动,就会导致到硬盘分区时提示没有发现可用磁盘,这时我们就需要首先加载该RAID卡驱动,从而让系统识别到要使用的磁盘. RHEL5 和 ...
- alibaba工程师,如何解决乐观锁冲突问题?
很多做过电商系统的人应该知道,我们在设计电商系统中关于商品库存扣减时,在大部分情况下(并发量不高时),商品库存都可以直接在关系型数据库中进行扣减,那么在限时抢购活动正式开始后,那些单价比平时更给力.更 ...
- 【39】为什么使用卷积?(Why convolutions?)
为什么使用卷积?(Why convolutions?) 我们来分析一下卷积在神经网络中如此受用的原因,然后对如何整合这些卷积,如何通过一个标注过的训练集训练卷积神经网络做个简单概括.和只用全连接层相比 ...
- IO流学习之综合运用(文件复制)
通过File.字节流.字节流缓冲区实现文件复制 需求: 1.用File类读取指定文件File下的所有文件(包括Copy文件夹内的所有文件) 2.将所有文件复制到指定文件FileCopy夹下 需求分析: ...
- ES的性能优化
ES的性能优化 es在数据量很大的情况下(数十亿级别)如何提高查询效率? 在es里,不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景.也许有的场景是你换个参数,或者调整一下语法,就可以搞定 ...
- 题解【洛谷P2730】魔板 Magic Squares
题面 首先我们可以发现,在每一次 BFS 时按照 \(A→B→C\) 的顺序枚举遍历肯定是字典序最小的. 然后就是普通的 BFS 了. 我们考虑使用 \(\text{STL map}\) 来存储起点状 ...
- 取Cookie值
string url_Login_Group = "http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&daid=5&am ...
- JavaDay10(下)
生产者消费者问题 问题描述 有两个进程:一组生产者进程和一组消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造一段数据,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必 ...