Изменение интервального расписания — подмножество книг для чтения, чтобы получить максимальное удовольствие

#algorithm #dynamic-programming #intervals

#алгоритм #динамическое программирование #интервалы

Вопрос:

Я довольно долго пытался решить эту проблему проектирования, но застрял в нескольких предположениях. Проблема формулируется как :

Вы заядлый читатель художественной литературы, но вы читаете только одну художественную книгу за раз. Для данной книги i вы можете точно предсказать количество удовольствия ei, которое вы получите от чтения книги, и сколько времени у вас уйдет на чтение этой книги ri. Время начинается с 0. Вы также знаете, что во время ti выйдет фильм, основанный на книге i. Если вы не дочитаете книгу i до времени ti, ваше удовольствие от этой книги упадет до отрицательной бесконечности, поскольку вы не сможете избежать спойлеров, и это будет бесконечно раздражать вас. Учитывая коллекцию из n книг, описанных параметрами ei; ri; ti, ваша цель — составить план — какое подмножество книг читать и когда — чтобы максимизировать общее удовольствие. Предположим, что книги уже отсортированы по неубывающему времени выхода фильмов, т. Е. t1 <= t2 <= .. <= tn. Кроме того, предположим, что все входные числа являются целыми положительными числами. Разработайте алгоритм динамического программирования для этой задачи, который выполняется за время O (n max ti).

Что я пробовал:
i. Я попытался рассчитать время завершения fi = ti — ri и применить самое раннее время завершения к интервалам.
ii. Рассчитал соотношение веса (развлечения) / fi, отсортировал в порядке убывания и выбрал лучшее.
iii. Сортируется ti в соответствии с ti и развлечением конкретной книги i, добавляя их в набор решений. До сих пор я не нашел ни одного оптимального решения.
Я понял, что это проблема планирования взвешенных интервалов, но запутался в том, как я могу отсортировать заданные интервалы, чтобы найти оптимальное решение.

Комментарии:

1. Эта проблема слабо сложна (в основном обобщает рюкзак), поэтому сортировка и выполнение чего-то жадного вряд ли приведут вас к чему-либо.

2. итак, по вашему мнению, какой подход @DavidEisenstat лучше всего подходит здесь?

3. Динамическое программирование. Из времени выполнения можно сделать вывод, что состояния DP, вероятно, должны иметь временную составляющую.

Ответ №1:

Позвольте f(t, i) представить максимальное достижимое удовольствие, учитывая первые i книги, где последняя выбранная книга завершена вовремя t . Заполните пробелы:

 f(t, 0) ->
  <fill>;

f(t, i) when (t > ti) ->
  <fill>;
  
f(t, i) ->
  max(
    % Read book i
    ei   f(t - <fill>, i - <fill>),
    % Don't read book i
    f(<fill>, i - <fill>)
  ).
  

Обратите внимание, что «когда последняя выбранная книга будет завершена вовремя t «, это не означает i , что книга th будет прочитана последней, просто мы рассмотрели до i книги th.