如何重新包装多个最大容量的背包,将它们的物品倒入一堆,重新整理,并取走一些物品?

时间:2019-02-18 19:39:24

标签: knapsack-problem subset-sum

在“多重背包问题”的此变体中,仅考虑了物品的重量,因此我想它更像是“多重子集和问题”,但使用背包就更容易解释了。

n个背包,每个背包都装满了达到其各自最大重量的物品C[j],其中0 <= j < n

将背包清空到一堆上,总共有m件物品,每件物品的重量为W[i],其中0 <= i < m。将堆中的项目混洗,并将k个项目从堆中0 <= k <= m处移出。

nmC[j]W[i]是大于零的整数; ijk是非负整数。

此状态是打包算法的初始输入。

如何重新包装所有剩余的m - k件物品,以便不超过每个背包C[j]的单独容纳能力?

  • 包装员不知道背包的包装方式
  • 背包是以前装好的,所以存在有效的解决方案
  • 使用的背包的数量无需优化,也可以是空的背包和/或包装不足的背包
  • 即使重量也为整数,也不能将物品分解为较轻的部分
  • 必要时可以对物品和背包进行分类
  • 我最大的担心是正确性,而时间比内存使用更重要
  • 从提供的示例输入中,通常是m <= 10k ~= 7,但是在某些情况下,m = 20k = 0k = 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 ]
  }
];


1 个答案:

答案 0 :(得分:0)

是否知道从装箱单中删除了哪些物品?并且,已知哪种算法成功打包了原始列表?如果已知这些信息,则子集列表的打包将恢复为打包原始列表的问题:使用先前成功的打包算法打包原始列表,然后从打包的背包中取出物品以获得子集列表的打包。 / p>