knapsack-problem - 如何重新包装多个最大容量的背包,将他们的物品倾倒在一堆,洗牌,并移除一些物品?
问题描述
在多背包问题的这个变体中,只考虑物品的重量,所以我猜它更像是多子集和问题,但用背包更容易解释。
有n
背包,每个背包都装满了其个人最大重量容量的物品C[j]
,其中0 <= j < n
.
背包被清空成一堆,总共有m
物品,每件都有重量W[i]
,其中0 <= i < m
。将堆中的物品洗牌并k
从堆中取出物品,其中0 <= k <= m
。
n
, m
,C[j]
和W[i]
是大于零的整数;i
,j
并且k
是非负整数。
该状态是打包算法的初始输入。
如何重新包装所有剩余物品,以免超出m - k
每个背包的单独容量?C[j]
- 包装工不知道背包以前是如何包装的
- 背包以前是打包好的,所以存在一个有效的解决方案
- 使用的背包数量不需要优化,也可以有空背包和/或包装不足的背包
- 物品不能被分解成更轻的部分,即使得到的重量也是整数
- 必要时可以对物品和背包进行分类
- 我最关心的是正确性,时间比内存使用更重要
- 从我提供的示例输入中,通常是
m <= 10
andk ~= 7
,但在某些情况下m = 20
, ork = 0
ork = m
我不知道首次拟合或满箱包装算法是否能保证在接近零时达到正确的结果k
,例如:如果一个算法在一个大背包中包装尽可能多的小物品,但是一个大物品需要要打包,唯一的大背包已经装满了。
这是我想要完成的 Javascript 中的一个简单示例:
let knapsacks = [
{ capacity: 13 },
{ capacity: 9 },
{ capacity: 60 },
{ capacity: 81 }
];
let items = [ 52, 81, 13 ];
// all items packed
let aSolution = [
{
capacity: 13,
items: [ 13 ]
},
{ capacity: 9 },
{
capacity: 65,
items: [ 52 ]
},
{
capacity: 81,
items: [ 81 ]
}
];
// item 81 not packed
let notASolution = [
{ capacity: 13 },
{ capacity: 9 },
{ capacity: 65 },
{
capacity: 81,
items: [ 52, 13 ]
}
];
解决方案
是否知道从装箱单中删除了哪些物品?而且,是否知道是什么算法成功打包了原始列表?如果这些是已知的,那么子集列表的打包回到原始列表的打包问题:使用之前成功的打包算法打包原始列表,然后从打包的背包中取出物品以获得子集列表的打包。
推荐阅读
- git - 远程路径还原更改
- javascript - 带有 DOM 的 Jquery $.each 循环,不能适用于所有元素
- python-3.x - 共享相似键的字典以及如何一起使用 2 个字典
- qt - 如何在地图上拖动多个目标?
- java - 从文件中读取数字并存储到二维数组中
- google-cloud-functions - 面临使用 oidcToken 从云任务调用云函数的挑战
- python - 如何递归地遍历列表?[Python]
- flutter - 在 Flutter 中更新使用 bytearray 创建的 MP3 文件中的元数据
- objective-c - 如何取消 sortUsingComparator
- ios - SwiftUI:带有偏移的按钮在 ScrollView 中不起作用