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

Содержание

Слайд 2

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

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

Слайд 3

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

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

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

Слайд 4

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

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

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

40$

50$

60$

100$

200$

У всех вещей есть цены.

Суммарная стоимость украденного должна быть максимальной.
Слайд 5

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

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

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

40$

50$

60$

100$

200$

У всех вещей есть цены.

Суммарная стоимость украденного должна быть максимальной.

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

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 6

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

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

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

40$

50$

60$

100$

200$

У всех вещей есть цены.

Суммарная стоимость украденного должна быть максимальной.

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

3 кг

3 кг

5 кг

12 кг

18 кг

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

20

Слайд 7

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 150$?

Слайд 8

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 190$?

Слайд 9

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 200$?

Слайд 10

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 210$!

Слайд 11

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

20

Max: 210$!

Слайд 12

Формат ввода: N M m1 m2 … mn c1 c2 …

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

вещей
M – вместимость рюкзака
mi – вес i-ой вещи
ci – стоимость i-ой вещи

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 13

Формат ввода: N M m1 m2 … mn c1 c2 …

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

вещей
M – вместимость рюкзака
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 …

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

вещей
M – вместимость рюкзака
mi – вес i-ой вещи
ci – стоимость i-ой вещи
Формат вывода:
Одно число – максимальная стоимость кражи

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 15

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

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 16

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

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

взять…

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

+

-

+

-

+

-

+

-

+

-

Слайд 17

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

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

+

-

+

-

+

-

+

-

+

-

Слайд 18

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

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

вычислять несколько тысяч лет)

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. Последние два алгоритма назывались жадными. Для данной задачи они

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

40$

50$

60$

100$

200$

3

кг

3 кг

5 кг

12 кг

18 кг

Слайд 23

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

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

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 24

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

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

1)

40$

50$

60$

100$

200$

3 кг

3 кг

5 кг

12 кг

18 кг

Слайд 25

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

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

1)
Будем считать, что все вещи пронумерованы.

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$

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12

кг
Слайд 32

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12

кг
Слайд 33

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

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

сверху-вниз, слева-направо.

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Слайд 34

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

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

сверху-вниз, слева-направо, выражая каждый следующий ответ через предыдущие.

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Слайд 35

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

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

P[i][j].

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Слайд 36

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

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

Слайд 37

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

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

Не брать

вещь №i
Слайд 38

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

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

Не брать

вещь №i

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

Слайд 39

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Только, если влезает. Что это значит?

Слайд 40

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Только, если влезает
wi ≤ j

Слайд 41

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Мы точно зарабатываем: ci

Слайд 42

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Плюс, у нас осталось еще свободное место…

Слайд 43

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Плюс, у нас осталось еще свободное место…
Сколько?

wi

j

Слайд 44

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

j - wi

wi

j

Слайд 45

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Как его оптимально заполнить?

wi

j

Слайд 46

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Таблица P знает ответ на этот вопрос!

wi

j

Слайд 47

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

В ячейке P[…][…] уже лежит лучшая сумма

wi

j

Слайд 48

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

В ячейке P[…][j-wi] уже лежит лучшая сумма

wi

j

Слайд 49

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

В ячейке P[i-1][j-wi] уже лежит лучшая сумма

wi

j

Слайд 50

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Итого:
ci + P[i-1][j-wi],
если влезет

wi

j

Слайд 51

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Итого:
ci + P[i-1][j-wi],
если влезет

Слайд 52

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Итого:
ci + P[i-1][j-wi],
если влезет

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

Слайд 53

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

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

40$

50$

3 кг

3 кг

60$

100$

200$

5 кг

12 кг

Взять вещь №i

Не брать вещь

№i

Итого:
ci + P[i-1][j-wi],
если влезет

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