Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички / Лаб_3_Динамическое_программирование.docx
Скачиваний:
0
Добавлен:
28.06.2026
Размер:
30.27 Кб
Скачать

Задание 7. Размен

Рассматривается задача проектирования алгоритма выдачи наличных в банкомате. Банкомат должен выдать клиенту запрошенную сумму, используя минимально возможное количество купюр. Необходимо сравнить работу двух подходов: жадного алгоритма и динамического программирования.

Предположим, что разрабатываются две версии банкомата для разных стран. В первой версии используется стандартная система номиналов, для которой жадный алгоритм обычно работает корректно. Во второй версии используется нестандартная система номиналов, в которой жадный выбор не всегда приводит к оптимальному решению.

Используйте два набора номиналов:

coins1= [1, 5, 10, 25, 50, 100]

coins2 = [1, 4, 6, 9]

Для каждой системы номиналов необходимо выполнить размен следующих сумм:

amounts = [23, 37, 58, 74, 99, 123]

Для каждой суммы и для каждого набора номиналов требуется реализовать два способа решения:

  1. Жадный алгоритм, который на каждом шаге выбирает максимально возможный номинал,

  2. Метод динамического программирования, который гарантированно находит минимальное количество купюр.

Для каждого случая программа должна вывести:

  • запрашиваемую сумму;

  • используемый набор номиналов;

  • результат работы жадного алгоритма;

  • результат работы динамического программирования;

  • количество использованных купюр;

  • список выбранных номиналов;

  • информацию о том, совпали ли результаты двух подходов.

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

Задание 7. Кладоискатели

Петя, Вася и Терентий нашли клад в старом заброшенном доме. Внутри оказалось множество ценных предметов: монеты, украшения, кубки, старинные книги, драгоценные камни и другие находки. Однако унести всё сразу они не могут, потому что у каждого из них свой рюкзак с ограниченной вместимостью. Кроме того, рюкзаки у них разные, так как друзья были разного возраста и взяли с собой снаряжение разного размера.

Необходимо разработать программу, которая определяет, какие предметы следует распределить по рюкзакам Пети, Васи и Терентия так, чтобы суммарная стоимость всех унесённых вещей была максимальной. Каждый предмет можно взять не более одного раза. Предмет либо полностью помещается в один из рюкзаков, либо не берётся вовсе. Делить предмет между рюкзаками нельзя.

Даны три рюкзака с различной вместимостью:

capacities = [10, 14, 18]

В файле treasures.txt дан список найденных предметов, где для каждого указаны вес и стоимость.

Необходимо реализовать решение методом динамического программирования. Программа должна определить максимальную суммарную стоимость вещей, которые друзья смогут унести, а также вывести, какие именно предметы попадут в рюкзак Пети, в рюкзак Васи и в рюкзак Терентия.

После выполнения необходимо объяснить, что в данной задаче является состоянием динамического программирования, как формируется переход между состояниями и почему жадный выбор, например по максимальной стоимости предмета, по минимальному весу или по наибольшему отношению стоимости к весу, не гарантирует нахождения оптимального решения.