题目
题解
一、题目大意
有一棵有根树,每个叶子节点都有一个可赚的钱数,每走一条路都有相应的花费,问在不亏本的情况下从根节点能到达至多几个叶子节点。
首先解释一下分组背包
先理解一下分组背包~
一共有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] 早被