擅长:python、mysql、java
<p>这里有一个“多组合”实现,不需要消除重复排列。第一个参数,<code>n</code>,是list[Na,Nb,Nc,…]。在</p>
<p>它是作为递归生成器实现的,因此您可以迭代组合,而不必一次将它们都放在内存中。你在评论中说Na+Nb+。。。通常在20左右,但可能高达50或100。这意味着您几乎肯定不想将所有的组合存储在内存中。考虑一个有四个“颜色”的例子,其中Na=Nb=Nc=Nd=5。组合的数目是<code>choose(20, 5) * choose(15, 5) * choose(10, 5) = 11732745024</code>,其中{<cd3>}是{a1}。我的电脑只有16GB的内存,所以这个数量的组合所需的存储空间将远远超过我电脑的内存。在</p>
<pre><code>from itertools import combinations
def multicombinations(n, bins=None):
if bins is None:
bins = set(range(sum(n)))
if len(n) == 0:
yield []
else:
for c in combinations(bins, n[0]):
for t in multicombinations(n[1:], bins - set(c)):
yield [c] + t
</code></pre>
<p>它生成元组列表。也就是说,如果您对第一行的描述是“first row is:R=(0,1)B=(2,3)”,那么<code>multicombinations([2, 2])</code>生成的第一个值是<code>[(0, 1), (2, 3)]</code>。(鉴于下一步要执行的权重计算的说明,这可能不是结果的最佳格式。)</p>
<p>一些例子:</p>
^{pr2}$