有线电视网 题解

文章讲述了如何使用分组背包算法解决树形结构中,给定每个叶子节点的利润和路径花费,找到在不亏本情况下最多能到达的叶子节点数量。通过动态规划方法求解,重点在于转移状态和初始化dp数组。
摘要由CSDN通过智能技术生成

题目


题解

一、题目大意

有一棵有根树,每个叶子节点都有一个可赚的钱数,每走一条路都有相应的花费,问在不亏本的情况下从根节点能到达至多几个叶子节点。


首先解释一下分组背包

先理解一下分组背包~

一共有n组物品,背包容量v,每组物品至多选一个,每个物品至多选一次,物品有相应的重量 w[i] ,权值 c[i] ,问在不超过背包容量的情况下权值和最大为多少。我们用 f[i] 表示容量不超过i的情况下的最大权值

伪代码如下:
for (int i = 1; i <= n; i++) //遍历每一组
	for (int j = v; j >= 0; j--) //倒序枚举
		for (int k = 第一个物品; k <= 最后一个物品; k++) //枚举组内物品
			if (j >= w[k]) f[j] = max(f[j], f[j - w[k]] + c[k]); //转移 

我们先看一下不加空间优化的原始版本:f[i][j] 表示前 i 组物品选容量不超过 j 的最大权值。

如果是正序枚举的,那么 f[j-w[k]] 一定比 f[j] 早被

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值