Я задал этот вопрос о переполнении стека некоторое время назад: Проблема: продажа Боба . Кто-то предложил также разместить здесь вопрос.
Кто-то уже задавал вопрос, связанный с этой проблемой, здесь - минимальный вес леса данной мощности - но, насколько я понимаю, это не помогает мне с моей проблемой. На StackOverflow также стоит посмотреть ответ с самым высоким рейтингом.
Вот дословная копия моего вопроса StackOverflow. Вероятно, он неадекватно сформулирован для этого сайта (черт, я чувствую себя необразованным, просто спрашиваю его здесь), поэтому не стесняйтесь редактировать его:
Примечание. Это абстрактная формулировка реальной проблемы, связанной с упорядочением записей в SWF-файле. Решение поможет мне улучшить приложение с открытым исходным кодом.
У Боба есть магазин, и он хочет продать. В его магазине есть несколько товаров, и у него есть определенное целое количество единиц каждого товара на складе. У него также есть несколько смонтированных на полках ценников (столько же, сколько продуктов), на которых уже напечатаны цены. Он может разместить любой ценник на любом товаре (единая цена за один предмет для всего его запаса этого товара), однако некоторые товары имеют дополнительное ограничение - любой такой товар может быть не дешевле, чем определенный другой товар.
Вы должны найти, как расположить ценники так, чтобы общая стоимость всех товаров Боба была как можно ниже. Общая стоимость - это сумма назначенной ценовой метки каждого продукта, умноженная на количество этого продукта на складе.
Данный:
- N - количество товаров и ценников
- S i , 0≤ i <N - количество на складе товара с индексом i (целое число)
- P j , 0≤ j <N - цена на ценнике с индексом j (целое число)
- K - количество дополнительных пар ограничений
- A k , B k , 0≤ k <K - индексы произведений для дополнительного ограничения
- Любой индекс продукта может появляться не более одного раза в B. Таким образом, граф, образованный этим списком смежности, на самом деле является набором направленных деревьев.
Программа должна найти:
- M i , 0≤ i <N - отображение индекса продукта на индекс ценовой цены (P M i - цена продукта i )
Чтобы выполнить условия:
- P M A k ≤ P M B k , для 0≤ k <K
- Σ (S i × P M i ) при 0≤ i <N минимально
Обратите внимание, что если бы не первое условие, решением было бы просто отсортировать этикетки по цене и продукты по количеству и сопоставить их напрямую.
Типичные значения для ввода будут N, K <10000. В реальной проблеме есть только несколько отличных ценников (1,2,3,4).
Вот один пример того, почему большинство простых решений (включая топологическую сортировку) не будут работать:
У вас есть 10 товаров с количеством от 1 до 10 и 10 ценников с ценами от 1 до 10. Есть одно условие: товар с количеством 10 не должен быть дешевле, чем товар с количеством 1.$
Оптимальное решение:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2
с общей стоимостью 249 Если вы разместите 1,10 пары вблизи экстремума, общая стоимость будет выше.