Если бы не было никаких предпочтений, это было бы прямой проблемой максимального расхода с минимальным срезом.http://en.wikipedia.org/wiki/Maximum_flow_problem, следующим образом:
Создайте исходную вершину A. Из A создайте Z вершин, по одной для каждого человека.Емкость может быть бесконечной (или очень, очень большой).Создайте приемник B и создайте X вершин, по одной на каждую игру, связанных с B;вместимость должна быть Y (у вас есть Y билетов за игру).От каждого человека, ссылка на каждую игру, которую они оценили, с емкостью 1.
Если вы посмотрите на ссылку вики выше, есть около 10 алгоритмов для решения этой основной проблемы.Найдите тот, который вы понимаете и можете реализовать самостоятельно, потому что вам нужно будет немного его изменить.Я не знаком со всеми из них, но те, о которых я знаю, имеют шаг «выбери край» или «выбери путь».Вам следует изменить логику «как выбрать край», чтобы учесть приоритетность игр.Я не уверен, какой именно порядок должен быть (вам, вероятно, нужно будет поэкспериментировать), но если вы скажете, что игра с самым низким рейтингом - 1, следующая - от 2 до X, а затем оценка типа «ранжирование края- количество игр, на которые человек уже подписан, может сработать.