最大高度块的组合

2024-06-28 19:39:47 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一个给定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)

解不是最优的,解的次序也不是最优的。 有人能帮我解决这个问题吗?当然,答案并没有涵盖所有的可能性,我想知道如何解决这个问题。你知道吗


Tags: 列表ifdefcountextraelsetmp方块
1条回答
网友
1楼 · 发布于 2024-06-28 19:39:47

Elegant Python code for Integer Partitioning中取一个答案,对每个结果取itertools.permutations的排列。用itertools.chain.from_iterable将这些连接起来:

from itertools import chain, permutations
chain.from_iterable(map(permutations, integer_partitions))

相关问题 更多 >