首页 > 其他分享 >AcWing 10. 有依赖的背包问题

AcWing 10. 有依赖的背包问题

时间:2024-05-27 10:33:27浏览次数:27  
标签:10 背包 int 物品 nodes pi 节点 AcWing

https://www.acwing.com/problem/content/description/10/

有 N 个物品和一个容量是 V 的背包。
物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。
如下图所示:
QQ图片20181018170337.png
如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。
每件物品的编号是 i,体积是 vi,价值是 wi,依赖的父节点编号是 pi。物品的下标范围是 1…N。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。
输入格式
第一行有两个整数 N,V,用空格隔开,分别表示物品个数和背包容量。
接下来有 N 行数据,每行数据表示一个物品。
第 i 行有三个整数 vi,wi,pi,用空格隔开,分别表示物品的体积、价值和依赖的物品编号。
如果 pi=−1,表示根节点。 数据保证所有物品构成一棵树。

输出格式
输出一个整数,表示最大价值。

数据范围
1≤N,V≤100
1≤vi,wi≤100
父节点编号范围:

内部结点:1≤pi≤N;
根节点 pi=−1;
输入样例
5 7
2 3 -1
2 2 1
3 5 1
4 7 2
3 6 2
输出样例:
11
O(NV^2)
#include <iostream>
#include <vector>


using namespace std;

const int N = 105;
int dp[N][N];
int n, v;
struct NODE {
	int v, w, fa;
	vector<int> son;
}nodes[N];
int root; int ans;

void dfs(int x) {
	for (int i = nodes[x].v; i <= v; i++) {
		dp[x][i] = nodes[x].w;
	}
	int currv = nodes[x].v;

	//以x为根节点能获取的最大获益
	for (auto e : nodes[x].son) {
		dfs(e);

		for (int i = v; i >= currv; i--) {
			int nextv = nodes[e].v;
			for (int j = nextv; i + j <= v; j++) {
				dp[x][i + j] = max(dp[x][i + j], dp[x][i] + dp[e][j]);
				if (x == root) {
					ans = max(ans, dp[x][i + j]);
				}
			}
		}
	}

	return;
}



void solve() {
	dfs(root);

	cout << ans << endl;
}

int main()
{
	cin >> n >> v;
	for (int i = 1; i <= n; i++) {
		cin >> nodes[i].v >> nodes[i].w >> nodes[i].fa;
		if (-1 == nodes[i].fa) {
			root = i;
		}
		else {
			nodes[nodes[i].fa].son.push_back(i);
		}
	}

	solve();


	return 0;
}

我的视频题解

标签:10,背包,int,物品,nodes,pi,节点,AcWing
From: https://www.cnblogs.com/itdef/p/18215023

相关文章

  • 小白必看!月入10W的网盘推广项目,你也可以做到
    1.前言天夏Ai,专注分享人工智能精品资源:Ai副业项目,Ai效率神器!和您一起共享Ai信息,开启智能副业赚钱新时代!Ai+网盘推广拉新项目人人都可以做!网上网盘推广教程很多,但是不够详细全面!Ai+网盘推广拉新项目:借助Ai工具进行网盘拉新推广,简单高效!要去学会使用Ai工......
  • CIFAR-10 数据集的简介
    文章目录CIFAR-10数据集的简介文件结构图像数据结构访问数据Python代码CIFAR-10数据集的数据格式CIFAR-10数据集的简介CIFAR-10数据集是一个广泛使用的图像数据集,具体可见CIFAR-10和CIFAR-100数据集,它包含60,000张32x32像素的彩色(3channels)图像,分为1......
  • 100313. 所有球里面不同颜色的数目
    题目描述给你一个整数limit和一个大小为nx2的二维数组queries。总共有limit+1个球,每个球的编号为[0,limit]中一个互不相同的数字。一开始,所有球都没有颜色。queries中每次操作的格式为[x,y],你需要将球x染上颜色y。每次操作之后,你需要求出所有球中不同......
  • KubeSphere系列---【离线安装kubeSphere时报错:failed: [k8s_node02] failed to conne
    1.报错信息[root@k8s_masterkubesphere-3.4.1-1.23.15-offline-package]#./kkinitregistry-fconfig-sample.yaml-akubesphere.tar.gz_______||//||||//||//__||_____||//_____......
  • 《痞子衡嵌入式半月刊》 第 101 期
    痞子衡嵌入式半月刊:第101期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。本期刊是开源项目(GitHub:JayHeng/pzh-mcu-bi-weekly),欢迎提交issue,投稿或推荐你知道的嵌入式那些事儿。上期回顾:《痞子衡嵌入式半月......
  • 【C语言】10.C语言指针(1)
    文章目录1.内存和地址1.1内存1.2究竟该如何理解编址2.指针变量和地址2.1取地址操作符(&)2.2指针变量和解引⽤操作符(*)2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引⽤操作符2.3指针变量的⼤⼩3.指针变量类型的意义3.1指针的解引⽤3.2指针+-整数3.3void*指针......
  • P1020 导弹拦截
    原题链接:P1020[NOIP1999提高组]导弹拦截-洛谷|计算机科学教育新生态(luogu.com.cn)相当好的一道题,用于理解使用[[狄尔沃斯定理(Dilworth定理)]]当然这个定理肯定不止这么简单。第一问就是让求一个最大不上升子序列,如果用DP求解,将是\(O(n^2)\)的时间复杂度,而这道题......
  • 最新淘宝赔付项目,一单100+,活淘赔付项目怎么玩?
    首先咱们熟悉一下淘宝赔付规则:淘宝订单如果超过约定时间发货,如投诉成立,卖家需向您支付该商品实际成交金额的10%作为违约金(最高不超过100元,最低不少于5元,特殊商品除外),若卖家未配合主动支付违约金,淘宝会对卖家进行相应处处罚由于赔付上限100(10%)所以单笔订单上限只能拍......
  • P1048 [NOIP2005 普及组] 采药
    ##题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价......
  • OWASP Top 10 2021
    OWASPTOP10是开放式Web应用程序安全项目(OpenWebApplicationSecurityProject)发布的年度全球最严重的十大web应用程序安全风险。截止到目前,最近一次的发布时间是2021年(上一次发布是2017年)。A01:2021-失效的访问控制   A02:2021-加密机制失效   A03:2021-注......