Задача о рюкзаке. Backpack problem

Содержание

Слайд 2

Вы грабитель.

Вы грабитель.

Слайд 3

Вы грабитель.

Нужно выбрать вещи, которые Вы унесёте…

Вы грабитель. Нужно выбрать вещи, которые Вы унесёте…

Слайд 4

Вы грабитель.

Нужно выбрать вещи, которые Вы унесёте…

40$

50$

60$

100$

200$

У всех вещей есть цены. Суммарная

Вы грабитель. Нужно выбрать вещи, которые Вы унесёте… 40$ 50$ 60$ 100$
стоимость украденного должна быть максимальной.

Слайд 5

Вы грабитель.

Нужно выбрать вещи, которые Вы унесёте…

40$

50$

60$

100$

200$

У всех вещей есть цены. Суммарная

Вы грабитель. Нужно выбрать вещи, которые Вы унесёте… 40$ 50$ 60$ 100$
стоимость украденного должна быть максимальной.

Но у вещей есть ещё и вес!

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 6

Вы грабитель.

Нужно выбрать вещи, которые Вы унесёте…

40$

50$

60$

100$

200$

У всех вещей есть цены. Суммарная

Вы грабитель. Нужно выбрать вещи, которые Вы унесёте… 40$ 50$ 60$ 100$
стоимость украденного должна быть максимальной.

Но у вещей есть ещё и вес!

3 кг

3 кг

5 кг

12 кг

18 кг

У рюкзака ограниченная вместимость

20

Слайд 7

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 150$?

40$ 50$ 60$ 100$ 200$ 3 кг 3 кг 5 кг 12

Слайд 8

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 190$?

40$ 50$ 60$ 100$ 200$ 3 кг 3 кг 5 кг 12

Слайд 9

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 200$?

40$ 50$ 60$ 100$ 200$ 3 кг 3 кг 5 кг 12

Слайд 10

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 210$!

40$ 50$ 60$ 100$ 200$ 3 кг 3 кг 5 кг 12

Слайд 11

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 210$!

40$ 50$ 60$ 100$ 200$ 3 кг 3 кг 5 кг 12

Слайд 12

Формат ввода:
N M
m1 m2 … mn
c1 c2 … cn
N – количество вещей
M

Формат ввода: N M m1 m2 … mn c1 c2 … cn
– вместимость рюкзака
mi – вес i-ой вещи
ci – стоимость i-ой вещи

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 13

Формат ввода:
N M
m1 m2 … mn
c1 c2 … cn
N – количество вещей
M

Формат ввода: N M m1 m2 … mn c1 c2 … cn
– вместимость рюкзака
mi – вес i-ой вещи
ci – стоимость i-ой вещи
Пример:
20
3 5 12 18
40 50 60 100 200

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 14

Формат ввода:
N M
m1 m2 … mn
c1 c2 … cn
N – количество вещей
M

Формат ввода: N M m1 m2 … mn c1 c2 … cn
– вместимость рюкзака
mi – вес i-ой вещи
ci – стоимость i-ой вещи
Формат вывода:
Одно число – максимальная стоимость кражи

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 15

Подход 1.
Полный перебор
Сколько всего вариантов?

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Подход 1. Полный перебор Сколько всего вариантов? 40$ 50$ 60$ 100$ 200$

Слайд 16

Подход 1.
Полный перебор
Сколько всего вариантов?
Каждый предмет мы можем взять или не взять…

40$

50$

60$

100$

200$

3

Подход 1. Полный перебор Сколько всего вариантов? Каждый предмет мы можем взять
кг

3 кг

5 кг

12 кг

18 кг

+

-

+

-

+

-

+

-

+

-

Слайд 17

Подход 1.
Полный перебор
Всего 2n вариантов

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

+

-

+

-

+

-

+

-

+

-

Подход 1. Полный перебор Всего 2n вариантов 40$ 50$ 60$ 100$ 200$

Слайд 18

Подход 1.
Полный перебор
Даёт верный результат
Оооочень долго
(при n = 100 суперкомпьютер будет вычислять

Подход 1. Полный перебор Даёт верный результат Оооочень долго (при n =
несколько тысяч лет)

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

+

-

+

-

+

-

+

-

+

-

Слайд 19

Подход 2.
Брать самую дорогую вещь
Не всегда будет давать максимальный ответ
(уже в нашем

Подход 2. Брать самую дорогую вещь Не всегда будет давать максимальный ответ
примере не работало)
Приведите пример из трёх вещей

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 20

Подход 3.
Рассчитать плотность каждой вещи: сi/mi.
Брать вещи, в порядке убывания плотности, пока

Подход 3. Рассчитать плотность каждой вещи: сi/mi. Брать вещи, в порядке убывания
влезают.

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 21

Подход 3.
Рассчитать плотность каждой вещи: сi/mi.
Брать вещи, в порядке убывания плотности, пока

Подход 3. Рассчитать плотность каждой вещи: сi/mi. Брать вещи, в порядке убывания
влезают.
Тоже не всегда будет давать правильный ответ. (приведите пример)

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 22

Подходы 2-3.
Последние два алгоритма назывались жадными.
Для данной задачи они не подходят.

40$

50$

60$

100$

200$

3 кг

3

Подходы 2-3. Последние два алгоритма назывались жадными. Для данной задачи они не
кг

5 кг

12 кг

18 кг

Слайд 23

Подход 4.
Метод динамического программирования.

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Подход 4. Метод динамического программирования. 40$ 50$ 60$ 100$ 200$ 3 кг

Слайд 24

Подход 4.
Метод динамического программирования.
Заведём табличку (N + 1) x (M + 1)

40$

50$

60$

100$

200$

3

Подход 4. Метод динамического программирования. Заведём табличку (N + 1) x (M
кг

3 кг

5 кг

12 кг

18 кг

Слайд 25

Подход 4.
Метод динамического программирования.
Заведём табличку P:(N + 1) x (M + 1)
Будем

Подход 4. Метод динамического программирования. Заведём табличку P:(N + 1) x (M
считать, что все вещи пронумерованы.

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 26

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых
i вещей и имея рюкзак вместимостью j кг.

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 27

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых
i вещей и имея рюкзак вместимостью j кг.

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Что будет здесь?

Слайд 28

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых
i вещей и имея рюкзак вместимостью j кг.

40$

50$

3 кг

3 кг

Выбираем среди первых двух вещей

Слайд 29

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых
i вещей и имея рюкзак вместимостью j кг.

40$

50$

3 кг

3 кг

Выбираем среди первых двух вещей.
Рюкзак вместимостью 4 кг.

Слайд 30

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых

В P[i][j] будем хранить максимальную сумму, которую можно заработать, выбирая среди первых
i вещей и имея рюкзак вместимостью j кг.

40$

50$

3 кг

3 кг

Слайд 31

Сначала заполним очевидное: нулевой столбец и нулевую строку.
Как?

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Сначала заполним очевидное: нулевой столбец и нулевую строку. Как? 40$ 50$ 3

Слайд 32

Сначала заполним очевидное: нулевой столбец и нулевую строку.

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Сначала заполним очевидное: нулевой столбец и нулевую строку. 40$ 50$ 3 кг

Слайд 33

Сначала заполним очевидное: нулевой столбец и нулевую строку.
Будем заполнять оставшуюся часть сверху-вниз,

Сначала заполним очевидное: нулевой столбец и нулевую строку. Будем заполнять оставшуюся часть
слева-направо.

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Слайд 34

Сначала заполним очевидное: нулевой столбец и нулевую строку.
Будем заполнять оставшуюся часть сверху-вниз,

Сначала заполним очевидное: нулевой столбец и нулевую строку. Будем заполнять оставшуюся часть
слева-направо, выражая каждый следующий ответ через предыдущие.

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Слайд 35

Допустим, мы вычислили всё до i-ой строки и j-го столбца.
Сейчас вычисляем P[i][j].

40$

50$

3

Допустим, мы вычислили всё до i-ой строки и j-го столбца. Сейчас вычисляем
кг

3 кг

60$

100$

200$

5 кг

12 кг

Слайд 36

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i (последнюю)

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$

Слайд 37

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i (последнюю)

Не брать вещь

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
№i

Слайд 38

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i (последнюю)

Не брать вещь

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
№i

Вычислим эти значения и выберем наибольшее

Слайд 39

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Только,

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
если влезает. Что это значит?

Слайд 40

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Только,

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
если влезает
wi ≤ j

Слайд 41

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Мы

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
точно зарабатываем: ci

Слайд 42

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Плюс,

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
у нас осталось еще свободное место…

Слайд 43

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Плюс,

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
у нас осталось еще свободное место…
Сколько?

wi

j

Слайд 44

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

j

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
- wi

wi

j

Слайд 45

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Как

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
его оптимально заполнить?

wi

j

Слайд 46

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Таблица

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
P знает ответ на этот вопрос!

wi

j

Слайд 47

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

В

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
ячейке P[…][…] уже лежит лучшая сумма

wi

j

Слайд 48

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

В

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
ячейке P[…][j-wi] уже лежит лучшая сумма

wi

j

Слайд 49

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

В

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
ячейке P[i-1][j-wi] уже лежит лучшая сумма

wi

j

Слайд 50

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Итого:
ci

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
+ P[i-1][j-wi],
если влезет

wi

j

Слайд 51

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Итого:
ci

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
+ P[i-1][j-wi],
если влезет

Слайд 52

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Итого:
ci

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
+ P[i-1][j-wi],
если влезет

В ячейке P[…][…] уже есть ответ на эту задачу

Слайд 53

Есть два варианта

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь №i

Итого:
ci

Есть два варианта 40$ 50$ 3 кг 3 кг 60$ 100$ 200$
+ P[i-1][j-wi],
если влезет

В ячейке P[i-1][…] уже есть ответ на эту задачу