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

23.02 Количество программ из A в B (на убывание)

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

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

Задача 1#52529

Исполнитель Бот решил сыграть в игру. Он преобразовывает числа на доске с помощью трёх команд:

1. Вычесть 2

2. Вычесть 3

3. Извлечь корень

Первые две команды уменьшают число на доске на 2 и 3 соответственно, третья команда — извлекает из числа квадратный корень, если число является квадратом любого числа. Программа для такого исполнителя — это последовательность команд. Сколько существует программ, которые преобразуют исходное число 25 в число 3?

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

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

Идея рекурсивного решения состоит в том, чтобы построить функцию f(x, y), которая подсчитывает количество последовательностей команд, переводящих число x  в число y  . Внутри функции задаём три случая:

- Если текущее число x  стало меньше целевого y  , значит дальнейшее выполнение команд не может привести к    y  , и функция возвращает 0.

- Если x  равно y  , значит найден корректный путь, и функция возвращает 1.

- Если ни одно из этих условий не выполнено, функция рекурсивно вызывает сама себя три раза: первый раз с аргументом x − 2  (команда "вычесть 2"), второй раз с аргументом x − 3  (команда "вычесть 3"), третий раз с аргументом √ --
  x (команда "извлечь квадратный корень"). Сумма этих трёх значений даст количество всех программ, которые переводят x  в y  .

# Определяем функцию f(x, y), которая считает количество программ
def f(x, y):
    # Если текущее число меньше целевого, то путь невозможен
    if x < y:
        return 0
    # Если текущее число совпало с целевым, значит найден один путь
    elif x == y:
        return 1
    # В остальных случаях считаем все возможные переходы:
    # вычесть 2, вычесть 3 и извлечь квадратный корень
    else:
        return f(x - 2, y) + f(x - 3, y) + f(x ** 0.5, y)

# Запускаем функцию от 25 до 3 и выводим результат
print(f(25, 3))

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

Динамический подход строится на том, чтобы заранее заполнить массив a, где индекс соответствует числу, а значение в ячейке показывает количество способов добраться до него из числа 25.

- Инициализируем массив длиной, достаточной для всех промежуточных чисел (например, 1000 элементов), и присваиваем a[25] = 1, так как изначально мы находимся в числе 25, и существует ровно один способ быть в этом положении.

- Проходим по массиву в обратном порядке от 24 до 3 (включительно), для каждого числа i вычисляем количество способов дойти до него:

1. Добавляем a[i + 2], так как из числа i+2 можно получить i командой "вычесть 2".

2. Добавляем a[i + 3], так как из числа i+3 можно получить i командой "вычесть 3".

3. Добавляем a[i ** 2], так как из числа î2 можно получить i командой "извлечь квадратный корень".

- После завершения цикла значение a[3] даст общее количество программ, которые переводят 25 в 3.

# Создаем массив для хранения количества способов для чисел до 1000
a = [0] * 1000
# Исходное число 25 имеет один способ быть достигнутым
a[25] = 1
# Проходим по всем числам от 24 до 3 включительно
for i in range(24, 2, -1):
    # Количество способов добраться до i равно сумме:
    # из i+2 командой "вычесть 2",
    # из i+3 командой "вычесть 3",
    # из i**2 командой "извлечь корень"
    a[i] = a[i + 2] + a[i + 3] + a[i ** 2]
# Выводим количество программ, приводящих от 25 к 3
print(a[3])

Ответ: 238

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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