在“多重背包问题”的此变体中,仅考虑了物品的重量,因此我想它更像是“多重子集和问题”,但使用背包就更容易解释了。
有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
和k ~= 7
,但是在某些情况下,m = 20
或k = 0
或k = m
< / li>
例如,当k
接近零时,我不知道 first-fit 或 full-bin包装算法是否能保证达到正确的结果:如果算法在大背包中包装尽可能多的小物品,但是需要包装大物品,而唯一的大背包已经装满了。
这是我要完成的工作的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 ]
}
];
答案 0 :(得分:0)
是否知道从装箱单中删除了哪些物品?并且,已知哪种算法成功打包了原始列表?如果已知这些信息,则子集列表的打包将恢复为打包原始列表的问题:使用先前成功的打包算法打包原始列表,然后从打包的背包中取出物品以获得子集列表的打包。 / p>