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

23.01 Количество программ из A в B

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

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

Задача 1#75085

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

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

2. Прибавить 5

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

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

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

Идея рекурсивного решения заключается в построении функции, которая подсчитывает количество программ, преобразующих число a  в число b  , проверяя при этом условия задачи. На каждом шаге функции проверяется:

- если текущее число a  стало больше целевого b  , дальнейшие преобразования невозможны, возвращаем 0  ;

- если текущее число a  кратно 5, то траектория нарушает условие задачи, возвращаем 0  ;

- если текущее число a  равно b  , значит найден корректный путь, возвращаем 1  ;

- если ни одно из условий не выполнено, функция рекурсивно вызывает саму себя дважды: первый раз с a+ 4  (команда "прибавить 4"), второй раз с a+ 5  (команда "прибавить 5"), и складывает результаты этих вызовов, чтобы получить общее количество программ.

# Определяем функцию f(a, b) для подсчета количества программ
def f(a, b):
    # Если текущее число больше целевого b
    # или кратно 5, путь невозможен
    if a > b or a % 5 == 0:
        return 0  # Возвращаем 0, так как траектория недопустима

    # Если текущее число равно целевому, найден путь
    if a == b:
        return 1  # Возвращаем 1, увеличивая счетчик корректных траекторий

    # В остальных случаях рекурсивно суммируем количество траекторий
    # для двух возможных команд: прибавить 4 и прибавить 5
    return f(a + 4, b) + f(a + 5, b)

# Запускаем функцию от исходного числа 31 до 113
print(f(31, 113))

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

Идея динамического решения состоит в построении массива, где индекс соответствует числу, а значение по этому индексу показывает количество траекторий, ведущих к этому числу, начиная с числа 31. Сначала создаём массив длиной b+ 1  , заполненный нулями, и устанавливаем a[31] = 1  , так как существует ровно один способ находиться в начальном числе. Далее проходим циклом по всем числам от 32 до 113 и вычисляем количество траекторий для каждого числа:

- если число не кратно 5, значит в него можно попасть;

- количество программ для числа i  равно сумме программ для i− 4  и i− 5  , так как это соответствующие команды прибавления.

Итоговое количество программ хранится в a[113]  .

# Создаем массив для хранения количества программ для всех чисел до 113
a = [0] * (113 + 1)  # Индексы от 0 до 113
# Начальное число 31 имеет одну траекторию
a[31] = 1

# Перебираем числа от 32 до 113 включительно
for i in range(32, 113 + 1):
    # Проверяем условие: число не должно быть кратно 5
    if i % 5 != 0:
        # Количество программ для числа i равно сумме
        # программ для i-4 и i-5
        a[i] = a[i - 4] + a[i - 5]

# Выводим количество программ, ведущих от 31 к 113
print(a[113])

Ответ: 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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