Можно ли продать все предметы с заданной стоимостью людям с заданной суммой денег?

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

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

Каждый предмет должен быть куплен не более чем одним человеком, каждый человек может купить несколько предметов так, чтобы их стоимость не превышала сумму денег, которой он располагает.

Мое предпринятое решение:
Я думал о построении сети и поиске максимального потока, подобного этому:
- Сделать двудольный граф с вершинами в одной части, соответствующими людям , а в другой части - к предметам.
- Соединить людей с источником S и установить граничные мощности на деньги, которые есть у людей.
- Соединить предметы со стоком T и установить граничные мощности со стоимостью предметов.
 – Соедините каждого человека с предметами, которые он может купить, и установите предельные возможности в соответствии со стоимостью предмета.

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

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


person Grigor Gevorgyan    schedule 01.08.2017    source источник


Ответы (2)


Судя по всему, это своего рода проблема с упаковкой в ​​корзину.

См. также Несколько рюкзаков.

person Vincent Cantin    schedule 01.08.2017

Несколько рюкзаков точно решат эту проблему, но, безусловно, это излишество, поскольку все элементы имеют одинаковый вес (что является ценностью с точки зрения рюкзака).

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

person jszpilewski    schedule 01.08.2017