2015-08-31 2 views
1

Я пытающегося Проект Эйлера # 15, который по существу сводится к вычислению числа двоичных списков длины 2 * размер таким образом, что их записи подводить к размер, для конкретного кейс размер = 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]. Конечно, число таких последовательностей тривиально для вычисления для любого значения размера и равно некоторому биномиальному коэффициенту, но меня интересует явное генерирование правильных последовательностей в 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 в * 2 \ * размер * слоты?" – NightShadeQueen

+0

@NightShadeQueen: Нет, если вы хотите увидеть все перечисленные способы. –

ответ

1

Есть слишком много для случая size = 20 для повторения (даже если мы не будем нажимать) t материализуют их, 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 
+0

Спасибо, это здорово! –

+0

Хотя для * size * = 20 это, кажется, занимает очень много времени, чтобы вычислить ... Путь больше, чем «1-минутное правило», которое они имеют в Project Euler. Однако я не могу думать о более аккуратном решении. –

+0

Не понимаю. В самом первом предложении этого ответа я напоминаю вам, что слишком много для повторения. Это не так, как вы решили решить Euler # 15. Для этого вы должны либо (1) использовать комбинаторную формулу, либо (2) использовать динамическое программирование. Многие проблемы Эйлера имеют решение грубой силы, которое берет навсегда и может даже работать в этом примере, но не справится с реальной проблемой. – DSM

0

Я не уверен на 100% в математике по этой проблеме, но ваша последняя строка берет генератор и вбрасывает его в список, и на основе вашего примера и вашего размера 20, это массивный список , Если вы хотите его суммировать, просто повторите, но я не думаю, что вы можете получить прекрасный обзор каждого комбо.

Смежные вопросы