- •Лабораторная работа 2: Динамическое программирование и жадные алгоритмы
- •Задание 1. Типы данных, арифметика
- •Задание 2. Максимальная сумма непрерывного подмассива
- •Задание 3. Расшифровка сигнала
- •Задание 4. Минимальная стоимость пути.
- •Задание 5. Возведение в степень
- •Задание 6.1 Поездка до Владивостока.
- •Задание 7. Размен
- •Задание 7. Кладоискатели
- •Контрольные вопросы:
Задание 7. Размен
Рассматривается задача проектирования алгоритма выдачи наличных в банкомате. Банкомат должен выдать клиенту запрошенную сумму, используя минимально возможное количество купюр. Необходимо сравнить работу двух подходов: жадного алгоритма и динамического программирования.
Предположим, что разрабатываются две версии банкомата для разных стран. В первой версии используется стандартная система номиналов, для которой жадный алгоритм обычно работает корректно. Во второй версии используется нестандартная система номиналов, в которой жадный выбор не всегда приводит к оптимальному решению.
Используйте два набора номиналов:
coins1= [1, 5, 10, 25, 50, 100] coins2 = [1, 4, 6, 9] |
Для каждой системы номиналов необходимо выполнить размен следующих сумм:
amounts = [23, 37, 58, 74, 99, 123] |
Для каждой суммы и для каждого набора номиналов требуется реализовать два способа решения:
Жадный алгоритм, который на каждом шаге выбирает максимально возможный номинал,
Метод динамического программирования, который гарантированно находит минимальное количество купюр.
Для каждого случая программа должна вывести:
запрашиваемую сумму;
используемый набор номиналов;
результат работы жадного алгоритма;
результат работы динамического программирования;
количество использованных купюр;
список выбранных номиналов;
информацию о том, совпали ли результаты двух подходов.
После выполнения необходимо провести сравнительный анализ и сделать вывод, в каком случае жадный алгоритм даёт оптимальный ответ. Также необходимо объяснить, почему для одних систем номиналов жадный выбор оказывается корректным, а для других приводит к неоптимальному результату. Отдельно укажите, почему метод динамического программирования в данной задаче является более универсальным, но при этом требует хранения промежуточных результатов.
Задание 7. Кладоискатели
Петя, Вася и Терентий нашли клад в старом заброшенном доме. Внутри оказалось множество ценных предметов: монеты, украшения, кубки, старинные книги, драгоценные камни и другие находки. Однако унести всё сразу они не могут, потому что у каждого из них свой рюкзак с ограниченной вместимостью. Кроме того, рюкзаки у них разные, так как друзья были разного возраста и взяли с собой снаряжение разного размера.
Необходимо разработать программу, которая определяет, какие предметы следует распределить по рюкзакам Пети, Васи и Терентия так, чтобы суммарная стоимость всех унесённых вещей была максимальной. Каждый предмет можно взять не более одного раза. Предмет либо полностью помещается в один из рюкзаков, либо не берётся вовсе. Делить предмет между рюкзаками нельзя.
Даны три рюкзака с различной вместимостью:
capacities = [10, 14, 18] |
В файле treasures.txt дан список найденных предметов, где для каждого указаны вес и стоимость.
Необходимо реализовать решение методом динамического программирования. Программа должна определить максимальную суммарную стоимость вещей, которые друзья смогут унести, а также вывести, какие именно предметы попадут в рюкзак Пети, в рюкзак Васи и в рюкзак Терентия.
После выполнения необходимо объяснить, что в данной задаче является состоянием динамического программирования, как формируется переход между состояниями и почему жадный выбор, например по максимальной стоимости предмета, по минимальному весу или по наибольшему отношению стоимости к весу, не гарантирует нахождения оптимального решения.
