Если пользователь никогда не «хочет» тип, который он «имеет» для подсчета способа, которым это может быть сделано, достаточно комбинаторики, никакой алгоритм не требуется.Если вы хотите «показать», как происходит обмен, то:
Для визуализации проблемы расположите типы следующим образом:
TYPE A ........................... TYPE N
| | | |
| | | |
| USER 2 | | |
| USER 1 | | |
| USER 1 | +..........+
+----------+
HAS
WANTS
+----------+
| USER 3 |
| USER 4 |
| USER 5 |
| |
В нашем примере Пользователь 1имеет две карты типа А, у пользователя 2 есть одна, а пользователям 3,4 и 5 требуется по одной карте типа А.
Давайте подумаем в данный момент только о картах типа А.
Вам необходимо сформировать пары для обмена карточек, например, последовательную:
{{usr 1,usr3},{usr1, usr 4}, {usr2,usr5}}
Если каждый пользователь будет удовлетворен, у него будут те же владельцы, что и у спрашивающих.
Теперь, для формирования пар вы знаете, что вы должны выбрать один элемент каждого набора без репозиции.Поскольку могут быть повторения (пользователи хотят или имеют более одной карты одного типа), вы также должны учитывать это.Это для подсчета способов «обработки» каждого типа.И комбинаторики достаточно.
Для формирования пар вы можете:
1) Построить все различные перестановки из каждого набора:
{2, 1, 1} {1, 2, 1} {1, 1, 2} # == 3!/2!
{3, 4, 5} {5, 3, 4} {4, 5, 3} {4, 3, 5} {5, 4, 3} {3, 5, 4} # == 3!
2) Для каждой пары перестановок у вас есть различный результатустановите 3 х 6 = 18 в нашем примере.....
Сделайте то же самое для всех типов карт ...
И, наконец, у вас есть N возможных наборов результатов для каждого типа карт.Чтобы получить ВСЕ возможные способы обмена всех карт, вам необходимо объединить все возможные способы для каждого типа ...