Тема 23. Оператор присваивания и ветвления

23.04 Количество программ из A в B где траектория вычислений НЕ содержит число(-а)

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела оператор присваивания и ветвления
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#60489

Исполнитель Робот преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:

1. Прибавить 1

2. Умножить на 2

Программа для исполнителя Робот – это последовательность команд. Сколько существует программ, для которых при исходном числе 5 результатом является число 31, и при этом траектория вычислений не содержит число 14?

Показать ответ и решение

Решение рекурсией

Мы используем рекурсивный способ для подсчета количества программ, которые переводят число n  в число m  , не проходя через запрещённое число 14. Для этого определяем функцию f(n, m). Внутри функции мы делаем следующие проверки:

1. Если текущее число n  равно целевому m  ,

- значит мы достигли результата корректным путем,

- возвращаем 1.

2. Если текущее число n  превысило m  или равно запрещённому числу 14,

- дальнейшее движение невозможно,

- возвращаем 0.

3. В остальных случаях мы пробуем оба возможных действия:

- прибавляем 1 к текущему числу, вызывая f(n+1, m),

- умножаем текущее число на 2, вызывая f(n*2, m).

- Суммируем результаты этих двух вызовов, чтобы получить общее количество программ, ведущих к m  из текущего n  .

Таким образом, рекурсия последовательно перебирает все допустимые последовательности команд, исключая запрещённое число 14, и считает количество корректных программ.

# Определяем функцию f(n, m), которая считает количество программ
def f(n, m):
    # Если текущее число равно целевому,
    # значит найден корректный путь, возвращаем 1
    if n == m:
        return 1
    # Если текущее число больше целевого
    # или равно запрещённому числу 14,
    # дальнейшие действия невозможны, возвращаем 0
    if n > m or n == 14:
        return 0
    # В остальных случаях считаем все возможные пути:
    # 1) прибавляем 1
    # 2) умножаем на 2
    # Суммируем результаты этих вариантов
    return f(n+1, m) + f(n*2, m)

# Вызываем функцию для исходного числа 5 и целевого числа 31
# и выводим общее количество корректных программ
print(f(5, 31))

Решение динамикой

Мы можем использовать динамическое программирование для подсчета количества программ, создавая массив, где каждый индекс соответствует числу, а значение в ячейке — количеству программ, приводящих к этому числу из исходного числа 5, без прохождения через запрещённое число 14.

1. Создаём массив a длиной 32 (для чисел от 0 до 31), изначально заполняем его нулями.

2. Устанавливаем a[5] = 1, так как исходное число 5 даёт ровно один путь к самому себе.

3. Проходим циклом по числам от 6 до 31:

- Для каждого числа i  добавляем количество способов добраться из i − 1  (команда «прибавить 1»).

- Если число i  чётное, добавляем количество способов добраться из i∕∕2  (команда «умножить на 2»).

4. После заполнения массива исключаем запрещённое число: a[14] = 0.

5. В конце a[31] содержит количество программ, которые переводят 5 в 31 без прохождения через 14.

# Создаем массив для чисел от 0 до 31, изначально все значения 0
a = [0] * 32
# Начальное число 5, один способ быть в нем
a[5] = 1
# Перебираем числа от 6 до 31 включительно
for i in range(6, 32):
    # Количество способов добраться до i через прибавление 1
    # и через умножение на 2, если i четное
    a[i] = a[i - 1] + a[i // 2] * (i % 2 == 0)
    # Запрещаем проход через число 14
    a[14] = 0
# Выводим количество программ, которые ведут от 5 к 31
print(a[31])

Ответ: 12

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!