【发布时间】:2014-06-09 04:20:13
【问题描述】:
考虑一个给定 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
它使用 random 生成随机数 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)
解不是最优的,解的顺序也不是最优的。 有人可以帮我解决这个问题,而且答案自然不能涵盖所有可能性,我想知道如何解决它。
【问题讨论】:
-
这不是分区,因为 (2,1,3) 和 (3,1,2) 都在示例中。
-
abt 1113 我们能拿什么
标签: python combinations