考虑给出N个块的问题。它们必须彼此重叠(称为条形),并且必须铺设许多这样的条形,因此横条的总块数等于N.并且每个配置可以具有与位置变化一样多的组合。
例如,如果我有6个块,那么 (1,1,1,1,1,1) (1,2,2,1) (2,1,1,2) (2,2,1,1) ... (1,1,2,2)
每列都是一个块。
我做了类似的事情:
def combinations_occur(N, limit = 3):
l = []
for i in xrange(1,N+1):
tmp = []
count = 0
x = i if limit > i else limit
while count != N:
s = sum(tmp)
extra = random.randint(1,x)
while s + extra > N:
extra -= 1
tmp += [extra]
#print sum(tmp),N
if sum(tmp) == N:
l += list(set(permutations(tmp,len(tmp))))
break;
else: count += 1
return l
使用随机生成N次随机数,然后生成相同的排列以生成列表列表。产生的结果如,例如N = 6
(1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 2),
(1, 1, 1, 2, 1),
(1, 1, 2, 1, 1),
(1, 1, 2, 2),
(1, 2, 1, 1, 1),
(1, 2, 1, 2),
(1, 2, 2, 1),
(1, 2, 3),
(1, 3, 2),
(2, 1, 1, 1, 1),
(2, 1, 1, 2),
(2, 1, 2, 1),
(2, 1, 3),
(2, 2, 1, 1),
(2, 2, 2),
(2, 3, 1),
(3, 1, 2),
(3, 2, 1)
解决方案不是最优的,解决方案的顺序也不是最优的。 有人可以帮助我的方法加上答案并没有涵盖所有的可能性,当然,我想知道如何处理它。
答案 0 :(得分:1)
从Elegant Python code for Integer Partitioning获得答案,对于每个结果,请使用itertools.permutations
进行排列。加入itertools.chain.from_iterable
:
from itertools import chain, permutations
chain.from_iterable(map(permutations, integer_partitions))