Примечание: это абстрактная переработка реальной проблемы, связанной с упорядочением записей в SWF файле. Решение поможет мне улучшить приложение с открытым исходным кодом.
У Боба есть магазин, и он хочет продать. В его магазине много продуктов, и у него есть определенное количество единиц каждого продукта на складе. У него также есть ряд установочных меток на полке (столько, сколько количество продуктов), причем цены уже напечатаны на них. Он может размещать любую цену на любом продукте (единая цена за один товар за весь запас этого продукта), однако некоторые продукты имеют дополнительное ограничение - любой такой продукт не может быть дешевле, чем какой-либо другой продукт.
Вы должны найти, как расположить ценовые ярлыки, чтобы общая стоимость всех товаров Bob была как можно ниже. Общая стоимость - это сумма каждой номинальной метки цены продукта, умноженная на количество этого продукта на складе.
Дано:
- N – количество продуктов и ценников
- S i, 0≤i < N – количество в запасе продукта с индексом я (целое число)
- 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 & times; 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 вблизи крайней величины, общая стоимость будет выше.