4.3. Задача грабителя (задача о рюкзаке)
Задача. Имеется склад, на котором есть некоторый ассортимент товаров. Запас каждого товара считается неограниченным. Товары имеют две характеристики: mi – масса, ci – стоимость;
Необходимо выбрать набор товаров так, что бы его суммарная масса не превосходила заранее фиксированную массу М(т.е. Σmi ≤ M), и стоимость набора была как можно больше (Σci→max).
Идея решения. Считаем, что все массы mi целочисленные. Решим эту задачу методом динамического программирования. Изобретаем метод, т.е. формулу.
Нам необходимо найти f(M), т.е. максимально возможную сумму mi при заданном М. Предположим, что к этому моменту мы знаем, как решать эту задачу для всех меньших значений грузоподъемности. Тогда смотрим, какой товар мы положили в рюкзак предпоследним. Если это был первый товар стоимость c1, то мы должны оптимизировать стоимость рюкзака при грузоподъемности M – m1. Если это был второй товар стоимость c2, то оптимизация при грузоподъемности M – m2, и т.д. Среди этих величин выбираем максимальную.
Таким образом, получаем формулу:
Пример. Рассмотрим решение этой задача при следующем наборе товаров:
m: | 3 | 5 | 8 | – массы товаров, |
c: | 8 | 14 | 23 | – стоимости товаров. |
Решение.
Вычислим последовательно:
f(0) = 0; f(1) = 0; f(2) = 0; f(3) = 8; f(4) = 8;
f(5) = 14 = max(f(5-3)+8; f(5-5)+14; f(5-8)+23); - не рассматриваем при поиске максимума, так как f(-3) не определена.
f(6) = 16; f(7) = 16; f(8) = 23; f(9) = 24 = max(f(9-3)+8; f(3-5)+14; f(9-8)+23);
f(10) = 28; f(11) = 31; f(12)= 32; f(13) = 37 = max(f(13-3)+8; f(13-5)+14; f(13-8)+23).
Оценим трудоемкость решения задачи о рюкзаке методом ДП.
Для применения метода ДП все массы должны быть целочисленные (а стоимости – необязательно). Тогда если k – количество видов товаров, m – грузоподъемность, то имеем m шагов внешнего цикла (по грузоподъемности) и на каждом шаге находим максимум среди k чисел, каждое из которых является суммой двух слагаемых. В итоге получаем трудоемкость: T = m·k.
- Основные понятия. Справочный материал
- Основные понятия
- 1.2. Справочный материал. Сравнение скорости роста основных функций
- 2 Новые быстрые версии старых алгоритмов
- 2.1. Сортировки массивов
- 2.1.1 Метод прямого выбора (SelectSort)
- 2.1.2 Быстрая сортировка методом двоичных вставок (MergeSort)
- 2.2. Преобразование Фурье (бпф)
- 2.2.1. Дискретное преобразование Фурье
- 2.2.2. Полубыстрое преобразование Фурье (ппф)
- 2.2.3. Быстрое преобразование Фурье (бпф)
- 2.3. Быстрая свертка
- 2.3.1. Понятие свертки
- 2.3.2. Обычный и быстрый алгоритм свертки
- 2.4. Быстрое умножение
- 2.4.1. Быстрое умножение чисел
- 1 Суммирование
- 4 Произведения чисел вдвое меньшей
- 2.4.2. Быстрое умножение матриц
- 2.4.3. Очень быстрое умножение числе (алгоритм Шенхаге – Штрассена)
- 3. Задачи на графах
- 3.1. Справочный материал
- 3.2. Поиск минимального остова в связном неориентированном взвешенном графе
- 3.3. Нахождение кратчайшего расстояния
- 3.3.1. Алгоритм Форда – Беллмана
- 3.3.2. Алгоритм Дейкстры
- 3.4. Нахождение диаметра, радиуса и центра графа
- 3.5. Задача об изоморфизме графов
- 3.6. Задача коммивояжера. Её решение методом ветвей и границ.
- Задачи динамического программирования
- Задачи динамического программирования. Её решение методом динамического программирования.
- 4.2. Задача об оптимальном наборе самолетом скорости и высоты
- 4.3. Задача грабителя (задача о рюкзаке)
- 4.4. Задача о перемножении матриц
- 5 Классы p и np
- 5.1 Машина Тьюринга
- 5.2 Недетерменированные машины Тьюринга(ндмт)
- 5.3 Сводимость. Np-полнота.
- 5.4 Иерархия по сложности. Труднорешаемые задачи.
- Классы сложности.
- 6 Неразрешимые задачи
- 6.1 Новая модель алгоритма вычислений.
- 6.2 Нумерация программ
- 6.3 Неразрешимые проблемы
- 6.4 Теорема об ускорении
- Лабораторные работы
- Расчетно-графическое задание
- Ответы к домашним заданиям