我正在尝试Project Euler#15,它实质上减少了计算长度为 2 * size 的二进制列表的数量,使得它们的条目总和为 size ,特殊情况 size = 20 。例如,如果 size = 2 ,则有6个这样的列表:[1,1,0,0],[1,0,1,0],[1,0,0,1], [0,1,1,0],[0,1,1,0],[0,1,0,1],[0,0,1,1]。当然,对于任何值 size 来计算这样的序列的数量是微不足道的并且等于某些二项式系数但是我有兴趣在Python中显式地生成正确的序列。我尝试过以下方法:
import itertools
size = 20
binary_lists = itertools.product(range(2), repeat = 2*size)
lattice_paths = {lists for lists in binary_lists if sum(lists) == size}
但最后一行让我遇到了内存错误。什么是完成这个的简洁方法?
答案 0 :(得分:1)
对于size = 20的情况,有太多的东西要迭代(即使我们没有实现它们,137846528820不是我们可以在合理的时间内循环的数字),所以它'不是特别有用。
但你仍然可以通过考虑1s的位置使用内置工具来做到这一点:
from itertools import combinations
def bsum(size):
for locs in combinations(range(2*size), size):
vec = [0]*(2*size)
for loc in locs:
vec[loc] = 1
yield vec
给出了
>>> list(bsum(1))
[[1, 0], [0, 1]]
>>> list(bsum(2))
[[1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [0, 0, 1, 1]]
>>> sum(1 for x in bsum(12))
2704156
>>> factorial(24)//factorial(12)**2
2704156
答案 1 :(得分:0)
我不是百分之百地确定这个问题的数学,但你的最后一行是将一个生成器并将其转储到一个列表中,并根据你的例子,你的大小为20,这是一个庞大的列表。如果你想总结它,只需迭代,但我认为你不能得到每个组合的好看法