Нужно найти всевозможное кол-во команд
есть три команды:
- Прибавить 1
- Прибавить 2
- Умножить на 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(число*шаги)
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(число):
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]