用不同维度的项目填充包的算法逻辑

Algorithm logic for filling packages with items of different dimensions

我正在为我正在开发的应用程序编写一些传送功能。其中一项要求是找到确定哪些物品可以放入盒子中的最有效方法。我们还有一个要求,即一次只能将两件物品放入任何一个盒子中,并且它们必须完全适合盒子,没有 space 剩余。

我们将通过假设盒子和物品的尺寸是整数(而不是实际尺寸)来简化问题。

我需要编写一个函数,将项目大小数组和盒子大小作为参数,并检查是否有任何两个项目可以完美地放入盒子中。

例如,假设我们想要查看 2 件商品是否正好填满尺寸为 4 的方框。 尺寸为 1 和 2 的 2 件商品将无法使用,因为包装盒中有 1 件免费 space。

因此输入 {Item Sizes: [1,2], target: 4} 会 return false

示例输入和输出:

input: {Item Sizes: [1,3,5], target: 2} output: false
input: {Item Sizes: [1,1,3,5], target: 2} output: true
input: {Item Sizes: [1,3,5], target: 4} output: true
input: {Item Sizes: [1,3,5,4], target: 7} output: true

显然我可以通过一个循环 运行 数组并将每两个数字相加以检查它们是否等于框大小,但我需要一种更有效的方法。如果我们这样做,数组中每增加一项,计算量就会呈指数增长。例如,给定这些参数...

input: {Item Sizes: [1,3,5,4], target: 7} output: true

如果我没记错的话(1+3, 1+5, 1+4, 3+1, 3+5, 3+4, etc.) .但是,如果我们再向数组中添加一项,就像这样...

input: {Item Sizes: [1,3,5,4,6], target: 7} output: true

需要20次计算。如果 "n" 等于数组中的项目数,则公式将是这样的...

n * (n-1)

从 "n" 中减去一个,因为您无法对照该项目本身进行检查。 检查 1000 项的数组需要 999000 次计算。

一种优化方法是删除数组中任何大于框大小的整数,并在找到匹配项后立即跳出函数。

一定有更好的优化方法。任何帮助将不胜感激。

谢谢。

首先,请注意一般问题(每箱无限数量的物品)是 NP-Hard,实际上是子集和问题。

为了限制每个盒子恰好有两个项目,可以使用散列 table(如果盒子的大小不太大,则可以使用数组)在单次数据传递中完成, 并存储盒子大小的差异。

python代码:

def FindPair(array, box_size):
  s = {} #empty dictionary
  for (i,x)  in enumerate(array):
    if x > box_size:
      continue
    if x in s:
      print 'match for indices:', i, s[x]
      return True
    else:
      s[box_size - x] = i
  return False

print FindPair([1,3,5], 2)
print FindPair([1,1,3,5], 2)
print FindPair([1,3,5], 4)
print FindPair([1,3,5,4], 7)