考虑一个给定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)
解不是最优的,解的次序也不是最优的。 有人能帮我解决这个问题吗?当然,答案并没有涵盖所有的可能性,我想知道如何解决这个问题。你知道吗
从Elegant Python code for Integer Partitioning中取一个答案,对每个结果取
itertools.permutations
的排列。用itertools.chain.from_iterable
将这些连接起来:相关问题 更多 >
编程相关推荐