Я задавав це питання на Stack Overflow деякий час тому: Проблема: продаж Боба . Хтось запропонував розмістити це питання і тут.
Хтось уже задав тут питання, пов’язане з цією проблемою - Мінімальна вага лісу даної кардинальності - але, наскільки я розумію, це не допомагає мені в моїй проблемі. Відповідь на оцінку найвищої оцінки на StackOverflow також варто переглянути.
Ось дослівна копія мого питання StackOverflow. Це, мабуть, недостатньо сформульовано для цього сайту (чорт, я відчуваю себе недостатньо неосвіченим, просто запитуючи його тут), тому сміливо редагуйте його:
Примітка. Це абстрактне переформулювання проблеми з реального життя щодо замовлення записів у файлі SWF. Рішення допоможе мені покращити додаток з відкритим кодом.
У Боб є магазин, і він хоче продати. У його магазині є кілька товарів, і він має певну цілу кількість одиниць кожного товару на складі. Він також має ряд цінових етикеток, встановлених на полицях (стільки ж, скільки товарів), причому ціни на них уже надруковані. Він може розмістити будь-яку етикетку на будь-який товар (унітарна ціна на один товар на весь його товарний запас), проте деякі продукти мають додаткове обмеження - будь-який такий товар може бути не дешевшим, ніж певний інший товар.
Ви повинні знайти, як влаштувати етикетки, щоб загальна вартість всіх виробів Боба була якомога нижчою. Загальна вартість - це сума присвоєної цінності кожного продукту, помножена на кількість товару на складі.
Подано:
- N - кількість товарів і етикетки
- S i , 0≤ i <N - кількість на складі товару з індексом i (ціле число)
- P j , 0≤ j <N - ціна на етикетці з індексом j (ціле число)
- K - кількість пар додаткових обмежень
- A k , B k , 0≤ k <K - індекси добутку для додаткового обмеження
- Будь-який товарний індекс може з’являтися не більше одного разу в Б. Таким чином, графік, сформований у цьому списку суміжності, насправді є набором спрямованих дерев.
Програма повинна знайти:
- 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).
Ось один приклад того, чому більшість простих рішень (включаючи топологічне сортування) не працюватимуть:
Оптимальне рішення:
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 пари поруч із будь-якими крайніми, загальна вартість буде вище.