У меня есть произвольный набор элементов (точки ниже), а некоторое количество категорий перекрывается произвольным образом (ниже - A-C). Тест состоит в том, чтобы определить, возможно ли, чтобы каждый элемент был присвоен одной категории, среди тех, к которым он уже принадлежит, так что каждая категория заканчивается по крайней мере некоторым количеством элементов.
Так, например, мы можем потребовать, чтобы A, B и C могли претендовать на один элемент. Если нам даны все 4 точки ниже, показывая, что это возможно, просто: просто вставьте все элементы в список, пройдите по категориям и у каждой категории удалите элемент, к которому у него есть доступ, и до тех пор, пока каждый категория может удалить один элемент, мы сдаем тест.
Теперь предположим, что мы удалим синюю точку и повторим тест. Ясно, что мы можем назначить желтый для A, красный для B и зеленый для C, и снова мы пройдем. Но трудно кодифицировать это решение: если мы следуем предыдущему методу (опять же нет синей точки), тогда предположим, что А начинается с удаления зеленой точки. Теперь, если B удаляет желтую точку, мы пропустим тест (так как C не может удалить красную точку), тогда как если B удаляет красную точку, C все еще может принимать желтый цвет и пропускать.
Можно решить эту проблему грубой силой путем повторения всех возможных присвоений элементов категориям, проверяя, выполняется ли условие с каждой итерацией, но это не будет хорошо масштабироваться для произвольного количества элементов и категорий, и я есть ощущение, что умнее или эффективнее.
Я не знаю названия этой проблемы, что затрудняет исследование. Есть ли у него оптимальное решение? Если да, то какую сложность я могу ожидать от решения?