Similar presentations:
Лабораторная_работа_№6_6203_НизамоваДР
1. Лабораторная работа №6
Л А Б О Р А Т О Р Н А ЯР А Б О Т А
№ 6
Кошачий
рейд
ДИНАМИЧЕСКОЕ
Лабораторную работу №6
По алгоритмам и анализу сложности
Выполнила студентка группы 6203-020302D
Низамова Диана Руслановна
ПРОГРАММИРОВАНИЕ
2. Знакомство
ЗНАКОМСТВОЗДРАВСТВУЙТЕ! МЕНЯ ЗОВУТ
МИШКА, И Я КОШЕЧКА
ПРОФЕССОР УСАТЫХ НАУК! БУДУ
РАДА ОБЪЯСНИТЬ ВАМ ЗАДАЧКИ!
ДОБРЫЙ МЯУ, МЕНЯ ЗОВУТ
ТИМА, И Я КОТИК МАГИСТР
ОТДЫХА!
НО РАДИ ВАС ГОТОВ
ПОУЧАСТВОВАТЬ
И РАЗБАВИТЬ ЭТИ ЗАДАЧКИ
СВОИМ ФИРМЕННЫМ СТИЛЕМ!
3. Задача №1
ЗАДАЧА №1ЭКСКЛЮЗИВНЫЙ
РЕЙД
ОТ МИШКИ!
4. Таблица предметов
Тима, отвлекись от своего расслабона!У нас серьезная задача! Ночью мы
штурмуем кухонную тумбочку.
Наша общая грузоподъемность — 8 кг.
На полке лежат четыре уникальные
вещи, каждая в единственном
экземпляре. Нужно выбрать самый
ценный набор. Повторять предметы
нельзя!
Погоди, а почему нельзя просто
взять три лежанки? Я бы весь
день на них отдыхал…
Потому что лежанка ОДНА, Тима! Либо
мы её берем – 1 , либо оставляем - 0.
Смотри на таблицу ресурсов:
А-а-а, догнал! То есть если я заберу
мышь и лежанку, они займут ровно 8
кг, а ценность будет 14. И больше
таких вещей нет. Жаль, конечно...
ТАБЛИЦА
ПРЕДМЕТОВ
Предмет
Вес
Ценность
Пакетик
корма
2
4
Игрушечная
мышь
3
5
Кошачья
мята
4
7
Лежанка
5
9
5. Мишка поясняет Задачу Математическим языком
МИШКА ПОЯСНЯЕТ ЗАДАЧУМАТЕМАТИЧЕСКИМ ЯЗЫКОМ
Рекуррентное соотношения для рюкзака:
A[w, i] = max{A[w − wᵢ, i−1] + cᵢ,
Тима, запомни! i — это номер
предмета, а w — текущий вес. Мы либо
берем уникальный предмет, либо
используем результат без него.
Третьего не дано!
A[w, i−1]}
6. Матрица пересчета
МАТРИЦА ПЕРЕСЧЕТАw\i
0
1(Корм)
2(Мышь)
3(Мята)
4(Лежанк
а)
0
0
0
0
0
0
2
0
4
4
4
4
4
0
4
4
7
7
5
0
4
9
9
9
8
0
4
9
11
14
Результат Миши равен 14, если она возьмет лежанку и мышь.
7. Задача №2
ЗАДАЧА №2БЕЗЛИМИТНЫЙ
ШОППИНГ
ОТ ТИМЫ!
8. Таблица предметов
Мишка, смотри! Я нашел нижний ящик, атам — оптовый склад! Тут целые
коробки одинаковых ништяков. Веса и
ценность те же, но брать можно
сколько угодно раз! Мои 8 кг
грузоподъемности наконец-то
разгуляются!
О, а вот это уже задача
неограниченного рюкзака. И
какую же стратегию выберет наш
магистр отдыха?
Ну, раз ограничений на уникальность
нет, я просто возьму 4 пакетика
корма! Каждая весит по 2 кг, как раз
забью все 8 кг веса. А суммарная
ценность выйдет 16 — это даже больше,
чем в твоем плане!
Хвалю, Тима! Математически это
действительно самый оптимальный выбор.
Динамическое программирование работает
безупречно.
ТАБЛИЦА
ПРЕДМЕТОВ
Предмет
Вес
Ценность
Пакетик
корма
2
4
Игрушечная
мышь
3
5
Кошачья
мята
4
7
Лежанка
5
9
9. Тима поясняет Задачу Математическим языком
ТИМА ПОЯСНЯЕТ ЗАДАЧУМАТЕМАТИЧЕСКИМ ЯЗЫКОМ
Рекуррентное соотношения для неограниченного рюкзака:
A[w] = max{ A[w − wᵢ] + cᵢ } для всех wᵢ ≤ w
Мишка, смотри как просто! Нам не нужно
помнить всё прошлое, достаточно знать лучший
результат для меньшего веса. И если корм
вкусный — я возьму его хоть четырежды!
10. Матрица пересчета
МАТРИЦА ПЕРЕСЧЕТАw
0
1
2
3
4
5
6
7
8
A[w]
0
0
4
5
8
9
12
13
16
Ключевой шаг: A[8] = A[8-2] + 4 = A[6] + 4 = 12 + 4 = 16.
Результат Тимы будет 16, если он возьмет 4 пакетика корма.
11. Сравнение результатов
СРАВНЕНИЕ РЕЗУЛЬТАТОВТима
Мишка
13
13,5
14
14,5
Максимум
15
15,5
16
16,5
Результат
Сложность O(n*W)
Вывод
Оба алгоритма эффективны. Для
Тимы нужно меньше памяти, так
как используется одномерный
массив.
Возможность повторений
увеличивает общую ценность за
счет выбора наиболее
эффективных единиц.
12. Программная реализация
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ#Тима
dp = [0] * (W + 1)
for w in range(1, W + 1):
for weight, value in items:
if weight <= w:
dp[w] = max(dp[w], dp[w - weight] + value)
#Мишка
dp_table = [[0] * (W + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for w in range(1, W + 1):
if items[i-1].w <= w:
dp_table[i][w] = max(dp_table[i-1][w],
dp_table[i-1][w - items[i1].w] + items[i-1].v)