Как определить, может ли набор интервалов охватывать область ниже определенной стоимости?

#python #algorithm

Вопрос:

У меня есть набор интервалов, каждый из которых имеет определенную стоимость. Например

 [(0, 4, 10), (2, 6, 5), (5, 7, 2), (8, 10, 2), (5, 10, 10)]
 

Я хотел бы знать, существует ли подмножество интервалов, которое охватывает целые числа 1…10 (скажем) точно, не перекрывая друг друга и с общей стоимостью ниже заданного значения c . Стоимость покрытия — это произведение затрат на интервалы в покрытии.

В этом случае мы можем точно покрыть интервал с [(0, 4, 10), (5, 10, 10)] что и стоило 10*10=100 . Или мы можем покрыть интервал [(0,4,10), (5, 7, 2), (8, 10, 2)] что и стоило 10*2*2 = 40 .

Поэтому, если бы мы установили стоимость c=50 , то ответ был бы «ДА», а если бы мы установили c=30 , то ответ был бы «НЕТ».

Существует ли эффективный способ решения этой проблемы?

Мне было интересно, может ли это сделать какой-то вариант планирования взвешенных интервалов, но я не вижу, как внести необходимые изменения. Основная проблема заключается в том, что здесь мы заботимся только о покрытиях, которые покрывают весь интервал без перекрытий, и мы хотим минимизировать затраты на них.

Ответ №1:

Редактировать: Примечание @btillys комментарий об использовании журнала(стоимости) для веса ребер, это важно, так как нам нужен продукт затрат, а не сумма.

Да, существует эффективный способ решить эту проблему с помощью теории графов.

Пусть каждый интервал (a,b, cost) является узлом v , и пусть e это ребро между двумя узлами v1 = (a,b, cost) и v2 = (a2,b2, cost2) iff ‘a2 = b 1’ (неофициально: вы можете использовать v2, исходящий из v1).

Имейте начальный узел s , у которого есть ребро для всех узлов, a=0 и конечный узел f , у которого есть ребро для всех узлов b=10 .

Теперь проблема сводится к нахождению кратчайшего пути между s и f . Используя Djikstra или что-то подобное, сложность должна быть O(E VlogV)

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

1. Важная деталь. Это зависит от того, являются ли затраты аддитивными, поэтому вам нужно взять журналы исходных затрат, чтобы превратить умножение в сложение.

2. @Anush E -это количество интервалов. Вы должны сканировать их только для того, чтобы узнать, что это такое, поэтому сложность не может быть уменьшена ниже O(E) .

3. Хорошая мысль @btilly, я пропустил это, когда прочитал вопрос.