Нужно найти всевозможное кол-во команд

есть три команды:

  1. Прибавить 1
  2. Прибавить 2
  3. Умножить на 2

Задача: найти кол-во программ состоящих ровно из 6 команд которые число 1 преобразуют в 20.


Ответы (3 шт):

Автор решения: MBo

Нужная величина - сумма количества программ из ровно 5 команд, которые число 1 преобразуют в 19, 18, и в 10. Чувствуете, что рекурсия напрашивается?

→ Ссылка
Автор решения: GrAnd

Рекурсией. https://ideone.com/RMbBHl

def do(x, level=6):
    return x == 20 if level == 0 else do(x+1, level-1) + do(x+2, level-1) + do(x*2, level-1)

print(do(1))

Перебором. https://ideone.com/rR9KjA

from itertools import product
count = 0
for ops in product([1,2,3], repeat=6):
    x = 1
    for op in ops:
        if op in [1,2]:
            x += op
        else:
            x *= 2
    if x == 20:
        count += 1
        #print(ops)
print(count)
→ Ссылка
Автор решения: Qwertiy

Асимптотика O(число*шаги)

https://ideone.com/sxy0XC

n = 20
m = 6
s = 1

a = [[0 for c in range(m+1)] for i in range(n+1)]
a[s][0] = 1

for i,x in enumerate(a):
  for c,k in enumerate(x):
    if k and c<m:
      if i+1 <= n: a[i+1][c+1] += k
      if i+2 <= n: a[i+2][c+1] += k
      if i+i <= n: a[i+i][c+1] += k

print(a[n][m])
36

Весь a[n]:

[0, 0, 0, 0, 1, 13, 36]

Без ограничения количества действий за O(число):

https://ideone.com/Y3n76v

n = 20
s = 1

a = [0] * (n+1)
a[s] = 1

for i,x in enumerate(a):
  if i+1 <= n: a[i+1] += x
  if i+2 <= n: a[i+2] += x
  if i+i <= n: a[i+i] += x

print(a[n])
20174

Весь список:

[0, 1, 2, 3, 7, 10, 20, 30, 57, 87, 154, 241, 415, 656, 1101, 1757, 2915, 4672, 7674, 12346, 20174]

→ Ссылка