具有最大高度的块的组合

时间:2014-06-08 13:35:34

标签: python combinations

考虑给出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)

解决方案不是最优的,解决方案的顺序也不是最优的。 有人可以帮助我的方法加上答案并没有涵盖所有的可能性,当然,我想知道如何处理它。

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))