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

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

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

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

Задача 1#6479

Исполнитель ХЛЕБУШЕК преобразует число, записанное на экране.
У исполнителя есть три команды, которым присвоены номера:
1. Прибавь 1,
2. Прибавь 2,
3. Прибавь 3.
Первая из них увеличивает число на экране на 1, вторая — увеличивает его на 2, третья — увеличивает его на 3.
Программа для ХЛЕБУШКа — это последовательность команд.
Сколько есть программ, которые преобразуют число 1 в число 14?

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

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

Мы определяем функцию f(x, y), которая считает количество способов преобразовать число x в число y.

1. Если текущее число x стало больше числа y, то возвращаем 0, так как такой путь невозможен.

2. Если x == y, возвращаем 1, так как найден ровно один путь.

3. В остальных случаях мы складываем результаты трёх вызовов:

- f(x+1, y) — переход командой «прибавь 1»;

- f(x+2, y) — переход командой «прибавь 2»;

- f(x+3, y) — переход командой «прибавь 3».

Таким образом, функция находит общее количество программ, складывая все возможные пути. Чтобы получить ответ задачи, мы вызываем f(1, 14).

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

# Выводим количество программ, которые преобразуют 1 в 14
print(f(1, 14))

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

Мы можем посчитать количество способов с помощью массива. Для этого создадим список a, где a[i] будет обозначать количество способов преобразовать число 1  в число i  .

Изначально установим a[1] = 1, так как существует ровно один способ оказаться в числе 1  — это стартовое состояние.

Далее последовательно заполним массив:

- чтобы попасть в число i  , можно прийти из числа i − 1  (командой +1),

- или из числа i − 2  (командой +2),

- или из числа i − 3  (командой +3).

Поэтому общее число способов a[i] равно сумме a[i-1] + a[i-2] + a[i-3]. Вычисления нужно вести для всех чисел от 2  до 14  . Ответом задачи будет значение a[14].

# Создаем массив для хранения количества способов
a = [0] * 100
# В числе 1 есть один способ находиться — старт
a[1] = 1
# Заполняем массив для чисел от 2 до 14
for i in range(2, 15):
    # В i можно попасть из i-1, i-2 или i-3
    a[i] = a[i - 1] + a[i - 2] + a[i - 3]
# Выводим количество программ, которые преобразуют 1 в 14
print(a[14])

 

Решение аналитикой:

Количество программ, которые преобразуют число 1 в число n, обозначим R (n).  Число 1 у нас уже есть, значит, его можно получить с помощью “пустой” программы. Любая непустая программа увеличит исходное число, т.е. даст число, больше 1. Значит, R (1) = 1.  Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Число “2” может быть получено только из числа “1” командой под номером 1. Отсюда R (2) = 1.  Число “3” можем получить из чисел 1 и 2 — R (3) = R(1) + R (2) = 2.  Число “4” получаем из 1, 2 и 3 — R (4) = R (1 ) + R (2) + R(3) = 6.  Заметим, что количество программ для получения числа n находится по формуле — R (n) = R(n − 3 ) + R (n − 2) + R(n − 1 ).  Составим таблицу по данной формуле:

|--|--|--|--|--|----|---|---|---|-----|----|----|-----|-----|
|1-|2-|3-|4-|5-|-6--|7--|8--|-9-|-10--|11--|-12-|-13--|-14--|
|1 |1 |2 |4 |7 |13  |24 |44 |81 |149  |274 |504 |927  |1705 |
-------------------------------------------------------------

Отсюда получаем искомое количество программ — 1705.

 

Получается ответ: 1705.

Ответ: 1705

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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