Найдите последующую максимальную длину одновременно удовлетворяя двум ограничениям упорядочения

cs.stackexchange https://cs.stackexchange.com/questions/1287

Вопрос

Нам дают набор $ f = {f_1, f_2, f_3,…, f_n } $ of $ n $ fruits. Каждый фрукт имеет цену $ p_i $ и витаминный контент $ v_i $; Мы связали фрукты $ f_i $ с упорядоченной парой $ (p_i, v_i) $. Теперь мы должны организовать эти фрукты таким образом, чтобы отсортированный список содержит цены в восходящем порядке и содержание витамина в порядке убывания.

Пример 1: $ N = 4 $ и $ f = {(2, 8), (5, 11), (7, 9), (10, 2) } $.

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

  • $[(2, 8)]$
  • $[(5, 11)]$
  • $[(7, 9)]$
  • $[(10, 2)]$
  • $[(2, 8), (10, 2)]$
  • $[(5, 11), (7, 9)]$
  • $[(5, 11), (10, 2)]$
  • $[(7, 9), (10, 2)]$
  • $[(5, 11), (7, 9), (10, 2)]$

Из приведенных выше списков я хочу выбрать список максимального размера. Если более одного списка имеет максимальный размер, мы должны выбрать список максимального размера, сумма цены, наименьшая. Список, который должен быть выбран в приведенном выше примере, - $ {(5, 11), (7, 9), (10, 2) } $.

Пример 2: $ N = 10 $ и $$ f = {(99,10), (12,23), (34,4), (10,5), (87,11), (19,10), (90,18), (43,90), (13 100), (78,65) } $$

Ответ на этот пример экземпляр - $ [(13 100), (43,90), (78,65), (87,11), (99,10)] $.

До сих пор это то, что я делал:

  1. Сортировать оригинальный список в восходящем порядке по цене;
  2. Найти все последующие последствия отсортированного списка;
  3. Проверьте, действительна ли последующая, и сравните все действительные последующие последствия.

Однако это занимает экспоненциальное время; Как я могу решить эту проблему более эффективно?

Это было полезно?

Решение

Здесь будет работать динамическое программное решение, если содержимое витамина исходит из конечного набора (например, ограниченных целых чисел). Во -первых, сортируйте фрукты по повышению цены, а в случаях два или более фруктов имеют одинаковую цену, сортируйте их по содержанию витамина (спуска). Теперь определите $ m [f, v] $ как максимальное количество фруктов в сублистах, содержащих только последние фрукты (из списка отсортированного), имея содержание витаминов, не более чем $ v $. $ M [0, *] = 0 $ и $$ m [f, v] = begin {case} mathrm {max} {m [f-1, v], 1 + m [f-1, v_f ] } & text {if (v_f <= v )} m [f-1, v] & text {иное} end {case} $$ с использованием динамического программирования дает вам решение, которое Запускается в $ o ( text {количество фруктов} times text {возможные значения витамина}) $.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top