AcWing 10. 有依赖的背包问题
2024-10-08 09:11:18
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = ;
int n, m;
int v[N], w[N];
int h[N], e[N], ne[N], idx;
int f[N][N];
//f[i,j]表示所有从以i为根的子树中选,且总体积不超过j的方案
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u) {
for(int i=h[u]; ~i; i=ne[i]) {//遍历u号点的所有子树 物品组
int son=e[i];
dfs(e[i]);
//分组背包
for(int j=m-v[u]; j>=; j--)//体积
for(int k=; k<=j; k++)//循环决策,选哪个 当前用多少体积
//按体积划分
f[u][j]=max(f[u][j],f[u][j-k]+f[son][k]);
}
//把点u加进去
for (int i = m; i >= v[u]; i -- ) f[u][i] = f[u][i - v[u]] + w[u];
//清空剩余的部分 放不进去的情况
for (int i = ; i < v[u]; i ++ ) f[u][i] = ;
} int main() {
cin >> n >> m;
memset(h, -, sizeof h);
int root;//找根节点
for (int i = ; i <= n; i ++ ) {
int p;
cin >> v[i] >> w[i] >> p;
if (p == -) root = i;//说明为根节点
else add(p, i);//依赖p号点,那就建一条p指向i的边
}
dfs(root);//从根节点开始递归操作
cout << f[root][m] << endl;//表示考虑整课树的情况下,体积不超过m,最大价值是多少
return ;
}
最新文章
- Myeclipse 安装SVN步骤
- 赴美工作常识(Part 4 - 面试)
- SaltStack与ZeroMQ(二)
- Runas命令:能让域用户/普通User用户以管理员身份运行指定程序。
- TYVJ计算几何
- Html - 返回Top
- Team Homework #3 软件工程在北航——IloveSE
- hdu 1520 Anniversary party || codevs 1380 树形dp
- UDP TCP应用场景
- 在Apache Tomcat 7设置redis作为session store
- Set Matrix Zeroes -- LeetCode
- 开源免费的.NET图像即时处理的组件ImageProcessor
- [VirtualBox] 1、NAT模式下端口映射
- MLR算法[Paper笔记]
- MySQL索引扩展(Index Extensions)学习总结
- 给OkHttp Client添加socks代理
- Angular2 web project UltraRacing (一,如何启动一个Angular项目?)
- (转)如何禁用Windows 10系统的触摸屏
- angularjs学习第三天笔记(过滤器第二篇---filter过滤器及其自定义过滤器)
- delphi 文件查找