【发布时间】:2019-05-17 13:06:15
【问题描述】:
我的一位客户是一家生产不同(不同尺寸)木地板的公司。他们有一个问题,当有人购买 XXm² 的木地板时,他们必须将其装箱。
箱子最多可以处理 220 厘米。这些碎片从 30 厘米开始,上升 5 厘米,直到完整的 220 厘米。
我想达到什么目的?不同的块和大小的最佳组合成盒子,底部至少要有一个大块,否则盒子会“刹车”。那是因为盒子需要一个坚固的底部来处理上面的其他部分。
是的,就是这么说的。让我们去代码吧!
客户输入碎片,类似这样:
[220, 170, 150, 145, 130, 125, 125, 115, 110, 110, 105, 95, 95, 90,
90, 90, 75, 70, 70, 60, 60, 50, 50, 50, 50, 50, 50, 40]
最好的输出之一是:
['220', '170,50', '150,70', '145,75', '130,90',
'125,95', '125,95', '115,105', '110,110', '90,90,40',
'70,50,50,50', '60,60,50,50',]
我正在尝试使用 itertools:
from itertools import combinations
for i in range(1, 5): # Maximum 4 pieces
for comb in combinations(customer_input, i):
if sum(comb) <= 220 and sum(comb) >= 195:
print(comb)
第一次打印是:
(220,)
(170, 50)
(170, 50)
(170, 50)
(170, 50)
(170, 50)
(170, 50)
似乎它是正确的,但它输出组合(170, 50) 更多一次。我认为一种方法是在使用一块之后停止尝试制作新的组合。
我怎样才能实现它?
【问题讨论】:
标签: python python-3.x sum combinations itertools