59
Динамическое программирование, вторая лекция Иван Казменко Кружок по алгоритмам и структурам данных в СПбГДТЮ Четверг, 21 сентября 2011 года Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 1 / 10

Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Динамическое программирование, вторая лекция

Иван Казменко

Кружок по алгоритмам и структурам данных в СПбГДТЮ

Четверг, 21 сентября 2011 года

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 1 / 10

Page 2: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Оглавление

1 Дискретная задача о рюкзакеПостановка задачиВарианты постановки задачиПримерРешения: наивный алгоритмРешения: жадные алгоритмыРешения: динамическое программированиеВосстановление решения

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 2 / 10

Page 3: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Постановка задачи

Дискретная задача о рюкзаке

Входные данные:Есть n вещей и рюкзак вместимостью sВещь с номером i характеризуется размером (весом) wi и ценой ci

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

Дополнительное условие: wi — положительные целые числа.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 3 / 10

Page 4: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Варианты постановки задачи

Варианты постановки задачи

Нужно набрать как можно больше вещей (ci = 1)Решается жадным алгоритмом: отсортируем вещи по весу и будембрать, начиная с самой маленькой, пока они помещаютсяЦен нет, нужно набрать как можно больший вес (ci = wi )Решается аналогично исходной постановкеВещей каждого типа не одна, а сколько угодноРешается аналогично исходной постановке

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 4 / 10

Page 5: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Варианты постановки задачи

Варианты постановки задачи

Нужно набрать как можно больше вещей (ci = 1)Решается жадным алгоритмом: отсортируем вещи по весу и будембрать, начиная с самой маленькой, пока они помещаютсяЦен нет, нужно набрать как можно больший вес (ci = wi )Решается аналогично исходной постановкеВещей каждого типа не одна, а сколько угодноРешается аналогично исходной постановке

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 4 / 10

Page 6: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Варианты постановки задачи

Варианты постановки задачи

Нужно набрать как можно больше вещей (ci = 1)Решается жадным алгоритмом: отсортируем вещи по весу и будембрать, начиная с самой маленькой, пока они помещаютсяЦен нет, нужно набрать как можно больший вес (ci = wi )Решается аналогично исходной постановкеВещей каждого типа не одна, а сколько угодноРешается аналогично исходной постановке

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 4 / 10

Page 7: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Варианты постановки задачи

Варианты постановки задачи

Нужно набрать как можно больше вещей (ci = 1)Решается жадным алгоритмом: отсортируем вещи по весу и будембрать, начиная с самой маленькой, пока они помещаютсяЦен нет, нужно набрать как можно больший вес (ci = wi )Решается аналогично исходной постановкеВещей каждого типа не одна, а сколько угодноРешается аналогично исходной постановке

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 4 / 10

Page 8: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Варианты постановки задачи

Варианты постановки задачи

Нужно набрать как можно больше вещей (ci = 1)Решается жадным алгоритмом: отсортируем вещи по весу и будембрать, начиная с самой маленькой, пока они помещаютсяЦен нет, нужно набрать как можно больший вес (ci = wi )Решается аналогично исходной постановкеВещей каждого типа не одна, а сколько угодноРешается аналогично исходной постановке

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 4 / 10

Page 9: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Варианты постановки задачи

Варианты постановки задачи

Нужно набрать как можно больше вещей (ci = 1)Решается жадным алгоритмом: отсортируем вещи по весу и будембрать, начиная с самой маленькой, пока они помещаютсяЦен нет, нужно набрать как можно больший вес (ci = wi )Решается аналогично исходной постановкеВещей каждого типа не одна, а сколько угодноРешается аналогично исходной постановке

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 4 / 10

Page 10: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Пример

Пример

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 5 / 10

Page 11: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Пример

Пример

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Оптимальное решение:Выберем вещи с номерами 2 и 4.Суммарный вес равен 2+ 4 = 6.Суммарная цена равна 3+ 7 = 10.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 5 / 10

Page 12: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Пример

Пример

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Ещё одно оптимальное решение:Выберем вещи с номерами 1, 2 и 3.Суммарный вес равен 1+ 2+ 3 = 6.Суммарная цена равна 2+ 3+ 5 = 10.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 5 / 10

Page 13: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Пример

Пример

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Всего есть 2 · 2 · 2 · 2 = 16 вариантов решения:каждую вещь можно независимо от других либо взять, либо не взять.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 5 / 10

Page 14: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Пример

Пример

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Некоторые решения неоптимальны:Выберем вещи с номерами 1 и 4.Суммарный вес равен 1+ 4 = 5.Суммарная цена равна 2+ 7 = 9.

Заметим, что в этом решении не добавить ещё одну вещь.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 5 / 10

Page 15: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Пример

Пример

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Некоторые решения невозможны:Выберем вещи с номерами 3 и 4.

Суммарный вес равен 3+ 4 = 7 > s.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 5 / 10

Page 16: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: наивный алгоритм

Наивный алгоритм

Переберём все возможные подмножества вещейДля каждого подмножества проверим, что суммарный вес непревосходит sИз подмножеств, прошедших проверку, выберем подмножество смаксимальной суммарной ценой

Трудоёмкость: O(2n · n), при аккуратной реализации O(2n).Недостаток: большое (экспоненциальное) время работы.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 6 / 10

Page 17: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: наивный алгоритм

Наивный алгоритм

Переберём все возможные подмножества вещейДля каждого подмножества проверим, что суммарный вес непревосходит sИз подмножеств, прошедших проверку, выберем подмножество смаксимальной суммарной ценой

Трудоёмкость: O(2n · n), при аккуратной реализации O(2n).Недостаток: большое (экспоненциальное) время работы.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 6 / 10

Page 18: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: наивный алгоритм

Наивный алгоритм

Переберём все возможные подмножества вещейДля каждого подмножества проверим, что суммарный вес непревосходит sИз подмножеств, прошедших проверку, выберем подмножество смаксимальной суммарной ценой

Трудоёмкость: O(2n · n), при аккуратной реализации O(2n).Недостаток: большое (экспоненциальное) время работы.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 6 / 10

Page 19: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

Упорядочим вещи по какому-то критериюРассмотрим вещи в полученном порядкеВозьмём те из них, на которые хватает места

Трудоёмкость: O(n log n) на сортировку +O(n) на выбор.Недостаток: жадные алгоритмы решения этой задачи неверны.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 20: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

Упорядочим вещи по какому-то критериюРассмотрим вещи в полученном порядкеВозьмём те из них, на которые хватает места

Трудоёмкость: O(n log n) на сортировку +O(n) на выбор.Недостаток: жадные алгоритмы решения этой задачи неверны.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 21: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

Упорядочим вещи по какому-то критериюРассмотрим вещи в полученном порядкеВозьмём те из них, на которые хватает места

Трудоёмкость: O(n log n) на сортировку +O(n) на выбор.Недостаток: жадные алгоритмы решения этой задачи неверны.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 22: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

1. Порядок сортировки: по убыванию цены ci

n = 4s = 6

i 1 2 3 4wi 4 3 2 1ci 7 5 3 2

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 23: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

1. Порядок сортировки: по убыванию цены ci

n = 4s = 6

i 1 2 3 4wi 4 3 2 1ci 7 5 3 2

Найденное решение:Выберем вещи с номерами 1 и 3.Суммарный вес равен 4+ 2 = 6.Суммарная цена равна 7+ 3 = 10.

Решение оптимально.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 24: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

1. Порядок сортировки: по убыванию цены ci

n = 3s = 3

i 1 2 3wi 3 2 1ci 4 3 2

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 25: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

1. Порядок сортировки: по убыванию цены ci

n = 3s = 3

i 1 2 3wi 3 2 1ci 4 3 2

Найденное решение:Выберем вещь с номером 1.Суммарный вес равен 3.Суммарная цена равна 4.

Но это решение неоптимально.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 26: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

1. Порядок сортировки: по убыванию цены ci

n = 3s = 3

i 1 2 3wi 3 2 1ci 4 3 2

Оптимальное решение:Выберем вещи с номерами 2 и 3.Суммарный вес равен 2+ 1 = 3.Суммарная цена равна 3+ 2 = 5.

Значит, алгоритм работает неверно.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 27: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

2. Порядок сортировки: по убыванию веса wi

n = 4s = 6

i 1 2 3 4wi 4 3 2 1ci 7 5 3 2

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 28: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

2. Порядок сортировки: по убыванию веса wi

n = 4s = 6

i 1 2 3 4wi 4 3 2 1ci 7 5 3 2

Найденное решение:Выберем вещи с номерами 1 и 3.Суммарный вес равен 4+ 2 = 6.Суммарная цена равна 7+ 3 = 10.

Решение оптимально.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 29: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

2. Порядок сортировки: по убыванию веса wi

n = 3s = 3

i 1 2 3wi 3 2 1ci 4 3 2

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 30: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

2. Порядок сортировки: по убыванию веса wi

n = 3s = 3

i 1 2 3wi 3 2 1ci 4 3 2

Найденное решение:Выберем вещь с номером 1.Суммарный вес равен 3.Суммарная цена равна 4.

Но это решение неоптимально.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 31: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

2. Порядок сортировки: по убыванию веса wi

n = 3s = 3

i 1 2 3wi 3 2 1ci 4 3 2

Оптимальное решение:Выберем вещи с номерами 2 и 3.Суммарный вес равен 2+ 1 = 3.

Суммарная цена равна 3+ 2 = 5 > 4.Значит, алгоритм работает неверно.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 32: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

3. Порядок сортировки: по возрастанию веса wi

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 33: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

3. Порядок сортировки: по возрастанию веса wi

n = 4s = 6

i 1 2 3 4wi 1 2 3 4ci 2 3 5 7

Найденное решение:Выберем вещи с номерами 1, 2 и 3.Суммарный вес равен 1+ 2+ 3 = 6.Суммарная цена равна 2+ 3+ 5 = 10.

Решение оптимально.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 34: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

3. Порядок сортировки: по возрастанию веса wi

n = 3s = 5

i 1 2 3wi 2 3 4ci 1 2 4

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 35: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

3. Порядок сортировки: по возрастанию веса wi

n = 3s = 5

i 1 2 3wi 2 3 4ci 1 2 4

Найденное решение:Выберем вещи с номерами 1 и 2.Суммарный вес равен 2+ 3 = 5.Суммарная цена равна 1+ 2 = 3.Но это решение неоптимально.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 36: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

3. Порядок сортировки: по возрастанию веса wi

n = 3s = 5

i 1 2 3wi 2 3 4ci 1 2 4

Оптимальное решение:Выберем вещь с номером 3.Суммарный вес равен 4.

Суммарная цена равна 4 > 3.Значит, алгоритм работает неверно.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 37: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

4. Порядок сортировки: по убыванию «удельной стоимости» ciwi

n = 4s = 6

i 1 2 3 4wi 1 4 3 2ci 2 7 5 3ciwi

2.0 1.75 1.666 . . . 1.5

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 38: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: жадные алгоритмы

Жадные алгоритмы

4. Порядок сортировки: по убыванию «удельной стоимости» ciwi

n = 4s = 6

i 1 2 3 4wi 1 4 3 2ci 2 7 5 3ciwi

2.0 1.75 1.666 . . . 1.5

Найденное решение:Выберем вещи с номерами 1 и 2.Суммарный вес равен 1+ 4 = 5.Суммарная цена равна 2+ 7 = 9.

Но это решение неоптимально (9 < 10).Значит, алгоритм работает неверно.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 7 / 10

Page 39: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Воспользуемся тем, что веса — целые числаБудем рассматривать вещи по порядку

Подзадача:Пусть мы рассмотрели первые k вещейДля каждого целого суммарного веса u (0 6 u 6 s) выясним,какую максимальную суммарную цену могут иметь вещи с такимвесом

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 40: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Воспользуемся тем, что веса — целые числаБудем рассматривать вещи по порядку

Подзадача:Пусть мы рассмотрели первые k вещейДля каждого целого суммарного веса u (0 6 u 6 s) выясним,какую максимальную суммарную цену могут иметь вещи с такимвесом

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 41: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированиемСостояние: (k , u)— количество рассмотренных вещей и суммарный вес.Целевая функция: f (k , u)—максимальная суммарная цена.База: f (0, 0) = 0, f (0, u) = −∞ для всех u > 0.Ответ: Максимум f (n, u) по всем 0 6 u 6 s.Переход: пусть известны все f (k − 1, u), получим все f (k , u).

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 42: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированиемСостояние: (k , u)— количество рассмотренных вещей и суммарный вес.Целевая функция: f (k , u)—максимальная суммарная цена.База: f (0, 0) = 0, f (0, u) = −∞ для всех u > 0.Ответ: Максимум f (n, u) по всем 0 6 u 6 s.Переход: пусть известны все f (k − 1, u), получим все f (k , u).Динамика вперёд: из состояния (k − 1, u) есть два перехода.

В (k , u), если не брать вещь k , цена не измениласьВ (k , u + wk), если брать вещь k , цена увеличилась на ck

for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if f[k][u + w[k]] < f[k - 1][u] + c[k]:f[k][u + w[k]] := f[k - 1][u] + c[k]

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 43: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированиемСостояние: (k , u)— количество рассмотренных вещей и суммарный вес.Целевая функция: f (k , u)—максимальная суммарная цена.База: f (0, 0) = 0, f (0, u) = −∞ для всех u > 0.Ответ: Максимум f (n, u) по всем 0 6 u 6 s.Переход: пусть известны все f (k − 1, u), получим все f (k , u).Динамика вперёд: из состояния (k − 1, u) есть два перехода.

В (k , u), если не брать вещь k , цена не измениласьВ (k , u + wk), если брать вещь k , цена увеличилась на ck

for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if u + w[k] <= s:if f[k][u + w[k]] < f[k - 1][u] + c[k]:

f[k][u + w[k]] := f[k - 1][u] + c[k]

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 44: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированиемСостояние: (k , u)— количество рассмотренных вещей и суммарный вес.Целевая функция: f (k , u)—максимальная суммарная цена.База: f (0, 0) = 0, f (0, u) = −∞ для всех u > 0.Ответ: Максимум f (n, u) по всем 0 6 u 6 s.Переход: пусть известны все f (k − 1, u), получим все f (k , u).Динамика назад: в состояние (k , u) есть два перехода.

Из (k − 1, u), если не брать вещь k , цена не измениласьИз (k − 1, u − wk), если брать вещь k , цена увеличилась на ck

for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if f[k][u] < f[k - 1][u - w[k]] + c[k]:f[k][u] := f[k - 1][u - w[k]] + c[k]

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 45: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированиемСостояние: (k , u)— количество рассмотренных вещей и суммарный вес.Целевая функция: f (k , u)—максимальная суммарная цена.База: f (0, 0) = 0, f (0, u) = −∞ для всех u > 0.Ответ: Максимум f (n, u) по всем 0 6 u 6 s.Переход: пусть известны все f (k − 1, u), получим все f (k , u).Динамика назад: в состояние (k , u) есть два перехода.

Из (k − 1, u), если не брать вещь k , цена не измениласьИз (k − 1, u − wk), если брать вещь k , цена увеличилась на ck

for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if u - w[k] >= 0:if f[k][u] < f[k - 1][u - w[k]] + c[k]:

f[k][u] := f[k - 1][u - w[k]] + c[k]

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 46: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Анализ:Время работы: O(n · s)Требуемая память: O(n · s)

for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if f[k][u] < f[k - 1][u - w[k]] + c[k]:f[k][u] := f[k - 1][u - w[k]] + c[k]

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 47: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Оптимизация по памяти: заметим, что f (k , u) > f (k − 1, u).Время работы: O(n · s)Требуемая память: O(s)

for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if f[k][u] < f[k - 1][u - w[k]] + c[k]:f[k][u] := f[k - 1][u - w[k]] + c[k]

Избавимся от размерности k в массиве.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 48: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Оптимизация по памяти: заметим, что f (k , u) > f (k − 1, u).Время работы: O(n · s)Требуемая память: O(s)

for k := 1 upto n:for u := 0 upto s:

if f[u] < f[u]:f[u] := f[u]

if f[u] < f[u - w[k]] + c[k]:f[u] := f[u - w[k]] + c[k]

Первый переход теперь делается автоматически.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 49: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Оптимизация по памяти: заметим, что f (k , u) > f (k − 1, u).Время работы: O(n · s)Требуемая память: O(s)

for k := 1 upto n:for u := w[k] upto s:

if f[u] < f[u - w[k]] + c[k]:f[u] := f[u - w[k]] + c[k]

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 50: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Оптимизация по памяти: заметим, что f (k , u) > f (k − 1, u).Время работы: O(n · s)Требуемая память: O(s)

for k := 1 upto n:for u := w[k] upto s:

if f[u] < f[u - w[k]] + c[k]:f[u] := f[u - w[k]] + c[k]

Ошибка: вещи могут быть взяты более одного раза.Зато получилось решение одного из вариантов постановки задачи.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 51: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Решения: динамическое программирование

Решение динамическим программированием

Оптимизация по памяти: заметим, что f (k , u) > f (k − 1, u).Время работы: O(n · s)Требуемая память: O(s)

for k := 1 upto n:for u := s downto w[k]:

if f[u] < f[u - w[k]] + c[k]:f[u] := f[u - w[k]] + c[k]

Теперь каждая вещь берётся не более одного раза.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 8 / 10

Page 52: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.Преимущества:

Решение добавляет ответу наглядностиПроще отлаживать программуСуществует общий метод восстановления решения

Недостатки:Дополнительный объём кодаНекоторые оптимизации становятся невозможными

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 53: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.Преимущества:

Решение добавляет ответу наглядностиПроще отлаживать программуСуществует общий метод восстановления решения

Недостатки:Дополнительный объём кодаНекоторые оптимизации становятся невозможными

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 54: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.Преимущества:

Решение добавляет ответу наглядностиПроще отлаживать программуСуществует общий метод восстановления решения

Недостатки:Дополнительный объём кодаНекоторые оптимизации становятся невозможными

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 55: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]

if f[k][u] < f[k - 1][u - w[k]] + c[k]:f[k][u] := f[k - 1][u - w[k]] + c[k]

Заведём дополнительный массив p, в котором для каждого состояниязапишем, откуда мы в него пришли.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 56: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.for k := 1 upto n:for u := 0 upto s:

if f[k][u] < f[k - 1][u]:f[k][u] := f[k - 1][u]p[k][u] := 0

if f[k][u] < f[k - 1][u - w[k]] + c[k]:f[k][u] := f[k - 1][u - w[k]] + c[k]p[k][u] := 1

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 57: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.Восстанавливаем решение:

Сначала находим ответЗатем идём с конца, каждый раз находя предыдущее состояние спомощью массива p

k := nu := 0for v := 1 upto s:

if f[k][u] < f[k][v]:u := v

while k > 0:if p[k][u] == 1:

output ku := u - w[k]

k := k - 1

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 58: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Восстановление решенияНужно узнать не только ответ, но и как он был получен.Восстанавливаем решение:

Сначала находим ответЗатем идём с конца, каждый раз находя предыдущее состояние спомощью массива p

k := nu := 0for v := 1 upto s:

if f[k][u] < f[k][v]:u := v

while k > 0:if p[k][u] == 1:

output ku := u - w[k]

k := k - 1

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 9 / 10

Page 59: Динамическое программирование, вторая лекцияacm.math.spbu.ru/~gassa/school/2011-2012/20110922-ap-slides.pdf · Динамическое программирование,

Дискретная задача о рюкзаке Восстановление решения

Всё.

Иван Казменко (Кружок в СПбГДТЮ) Динамическое программирование 2 22.09.2011 10 / 10