alarm
Задайте вопрос
Информатика
Dupont

У исполнителя вычислить две команды, которым присвоены номера:1. прибавь 1,2. прибавь 4,3. умножить на 3. Первая из них увеличивает число на экрана на 1, вторая – на 4, третья – увеличивает его в 3 раза. Программа для Вычислителя – это последовательность команд. Как узнать сколько есть программ, которые число 1 преобразуют в число 16?

ответы: 1
Зарегистрируйтесь, чтобы добавить ответ
Ответ:

Есть несколько алгоритмов решения такой задачи.

Прямой перебор - попытка перебрать всевозможные последовательности этих команд и посмотреть, какие из них, примененные к 1 сделают из нее 16 - но это долгий способ, оценка сложности сверху без короткой схемы - это 3^15 таких последовательностей (сколько всего команд) ^ (максимально возможное число команд в подходящей программе, это 15 прибавлений по единичке).

Можно развить подход "от противного", который лежит в основе идей динаимического программирования: обозначив n(x) - какое количество различных программ преобразую число 1 в x, получаем формулу для исходного n(16) = n(15) + n(12) = (n(14) + n(11) + n(5)) + (n(11) + n(8) + n(4)) = . . .

Будем считать, что n(1) = 1

Тогда вот функция на питоне для подсчёта искомого числа. Вызов n(16) вернёт результат 136

def n(x):

if x < 1: return 0

elif x == 1: return 1

else: return n(x - 1) + n(x - 4) + (0 if x % 3 != 0 else n(x // 3))

У такого подхода есть несомненное преимущество: его не только проще написать, но и сложность его O(n)

215
draw up
Чтобы ответить необходимо зарегистрироваться.

Другие вопросы: - Информатика

PYTHON 1) Если элемент меньше

посчитайте ДАМ 20 поинтов Показ

Напишите программу на Python, ко

PYTHON Для того, чтобы не допу

Как узнать сколько единиц в двои

Необходим четкий и точный ответ:

Контакты
Реклама на сайте