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

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

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

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

Задача 1#60737

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

   1. Прибавь 1

   2. Прибавь 2

   3. Умножь на 3

Первая из них увеличивает число на экране на 1, вторая увеличивает число на 2, третья увеличивает число в 3 раза. Программа для исполнителя РазДваТри - это последовательность команд.

Сколько существует программ, которые преобразуют исходное число 3 в число 14 и при этом траектория вычислений содержит число 9?

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

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

Решение рекурсией основано на создании функции f(a, b), которая подсчитывает количество программ, преобразующих число a  в число b  . Алгоритм работы функции:

1. Если текущее число a  больше целевого числа b  , значит путь невозможен, возвращаем 0.

2. Если текущее число a  совпало с целевым b  , значит найден подходящий путь, возвращаем 1.

3. Если ни одно из условий не выполнено, то считаем все возможные переходы из текущего числа:

- прибавляем 1, вызываем f(a + 1, b);

- прибавляем 2, вызываем f(a + 2, b);

- умножаем на 3, вызываем f(a * 3, b);

и складываем результаты этих вызовов.

Так как по условию траектория должна содержать число 9, мы разбиваем задачу на два этапа:

- Первый этап: от 3 до 9, считаем количество способов дойти до 9.

- Второй этап: от 9 до 14, считаем количество способов дойти до 14, начиная с 9.

Общее количество программ равно произведению результатов этих двух этапов, так как для каждого пути из первой части можно использовать любой путь из второй части.

# Определяем рекурсивную функцию f(a, b)
def f(a,b):
    # Если текущее число превысило целевое, путь невозможен
    if a > b:
        return 0
    # Если текущее число совпало с целевым, найден корректный путь
    if a == b:
        return 1
    # В остальных случаях считаем все возможные переходы:
    # прибавляем 1, прибавляем 2, умножаем на 3
    return f(a + 1, b) + f(a + 2, b) + f(a * 3, b)

# Вычисляем количество программ от 3 до 14 через число 9
print(f(3, 9) * f(9, 14))

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

Динамический способ решения заключается в поэтапном заполнении массива a, где индекс соответствует числу, а значение по этому индексу показывает количество программ, которые приводят к этому числу. Алгоритм:

1. Создаем массив a длиной 15 (так как максимальное число 14) и заполняем нулями.

2. Инициализируем начальное число: a[3] = 1, так как стартуем с числа 3, существует ровно один способ быть в этом положении.

3. Перебираем числа от 4 до 14 включительно:

- Для числа i считаем количество программ из предыдущих чисел:

* из i-1, прибавив 1;

* из i-2, прибавив 2;

* из i//3, если i делится на 3, умножив на 3.

- Если число i равно 9, обнуляем все предыдущие ячейки массива, так как траектория должна содержать число 9.

Итоговое количество программ, которые ведут от 3 к 14 через число 9, хранится в a[14].

# Создаем массив для хранения количества программ до каждого числа
a = [0] * 15
# Инициализируем исходное число 3
a[3] = 1
# Перебираем все числа от 4 до 14
for i in range(4, 15):
    # Считаем количество программ через предыдущие числа
    a[i] = a[i - 1] + a[i - 2] + a[i // 3] * (i % 3 == 0)
    # Обнуляем предыдущие значения до числа 9, чтобы траектория обязательно содержала 9
    if i == 9:
        for j in range(i):
            a[j] = 0

# Выводим количество программ, которые ведут от 3 к 14 через число 9
print(a[14])

Ответ: 112

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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