为什么是整型背包的Capacity-1
Why Capacity-1 in integer knapsack?
整数背包问题的动态规划解,对于容量为C的背包,对于n个物品,其中第1个物品的大小为Si,值为Vi,则为:
M (C) = max (M(颈- 1),M(同单晶硅)+(六),我从1到n
这里M是一个数组。M(C)表示容量为C的背包的最大值。
M(C-1)在这个关系中有什么用?我的意思是,解决方案应该是这样的:
M (C) = max (M(同单晶硅)+(六),我从1到n
我认为M(C-1)涵盖的所有情况都包含在M(C)中。
如果我错了,请给我一个例子。
我想你的公式设置有点混乱——具体来说,你把袋子的容量和n-1个物品的子问题混淆了。让我们重新定义一个bit
- 设
P
表示问题,用n
项列表表示。 - 进一步,设
Pk
表示由原问题索引为1...k
的项组成的子问题,其中1 <= k <= n
。因此,Pn
相当于P
。 - 对于索引为
i
的每一项,设Vi
表示该项的值,Si
表示该项的大小。 - 设
C
为袋子的容量,C >= 0
- 设
M(Pk, C)
表示容量为C
的包装袋Pk
所描述的问题的最优解。M(Pk, C)
返回解决方案中包含的物品列表(因此也返回最优解决方案的值和袋子中的剩余容量)。
对于每一项,我们可以将其包含在最优解中,也可以不包含在最优解中。显然,最优解决方案是这两个选项中的任何一个。唯一需要考虑的情况是,如果有问题的物品不能装进包里。在这种情况下,我们必须排除它。
我们可以依靠递归来覆盖我们的每一项,因此不需要迭代。
M (Pk, C) =如果(Sk> C) M (p (k - 1), C)其他马克斯(M (p (k - 1), C), Vk + M (p (k - 1), C-Sk))
相关文章:
- 0-1背包代码中的错误.我的代码中有什么错误
- Capacity of a deque
- 分数背包边缘箱
- 具有多种约束(例如重量、体积等)的背包
- 背包问题,视觉工作室问题
- 分段故障背包问题
- 0-1 大重量背包
- 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区
- 为什么在调用 QXYSeries::replace() 后,当 size() 没有超过 capacity() 时 QVe
- 具有最小值和最大值的多维背包
- 此背包代码显示浮点[float]无效类型错误.可能是什么原因
- 背包问题根据单位重量的利润对数组进行排序
- Python到C++:使用递归列出背包的所有组合的算法
- 蛮力背包的C 一部分
- 重量总和约为10^9的背包
- 可以使用 1D 数组实现 0-1 背包吗?
- 有没有解决方案而不是在C++中移动背包回溯算法
- 回溯背包实施与C++
- 背包 - 如何识别使用的重量
- 为什么是整型背包的Capacity-1