我有3个可变大小的盒子:
A: 5, B: 3, C: 6
我有大小为a: 1, b: 2, c: 2, d: 3, e: 5
我显然可以按照以下模式使用它们:
A: a, b, c
B: d
C: e
但你也可以这样做:
A: e
B: a, b
C: c, d
有没有办法可以获得所有可能的包装?
这感觉就像垃圾箱包装挑战,但我并没有试图找到一个最佳的"解决方案,只是所有(或至少多个)可能的解决方案。
我想我可能会以随机顺序在项目上运行一个天真的bin打包算法,直到找到解决方案,但这似乎效率很低......
有什么想法吗?
答案 0 :(得分:1)
我刚刚实现了你要求的内容
boxSizes, itemSizes = [5, 3, 6], [1, 2, 2, 3, 5]
def recurse(boxes, itemIndex, solution, itemsUsed):
global itemSizes
if itemsUsed == len(itemSizes):
print solution
return
for i in range(len(boxes)):
for j in range(itemIndex, len(itemSizes)):
if boxes[i] - itemSizes[j] >= 0:
boxes[i] -= itemSizes[j]
solution[i].append(itemSizes[j])
recurse(boxes, j + 1, solution, itemsUsed + 1)
solution[i].pop()
boxes[i] += itemSizes[j]
recurse(boxSizes, 0, [[] for i in range(len(boxSizes))], 0)
<强>输出强>
[[1, 2, 2], [3], [5]]
[[2, 3], [1, 2], [5]]
[[2, 3], [1, 2], [5]]
[[5], [1, 2], [2, 3]]
[[5], [1, 2], [2, 3]]
[[2, 2], [3], [1, 5]]
[[2, 3], [2], [1, 5]]
[[2, 3], [2], [1, 5]]
[[5], [2], [1, 2, 3]]
[[5], [2], [1, 2, 3]]
[[5], [3], [1, 2, 2]]
我们看到一些解决方案在重复,这是因为输入中有两个相同的数字。