У меня есть набор элементов, например: {1,1,1,2,2,3,3,3}, и ограничивающий набор наборов, например {{3}, {1,2} , {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {2,3}, {2,3}. Я ищу перестановки предметов, но первый элемент должен быть 3, а второй должен быть 1 или 2 и т. Д.
Одна такая перестановка, которая подходит:
{3,1,1,1,2,2,3}
Существует ли алгоритм для подсчета всех перестановок для этой задачи в целом? Есть ли название для этого типа проблемы?
Для иллюстрации я знаю, как решить эту проблему для определенных типов «ограничивающих множеств».
Набор элементов: {1,1,2,2,3}, ограничения {{1,2}, {1,2,3}, {1,2,3}, {1,2}, {1,2 }}. Это равно 2! / (2-1)! / 1! * 4! / 2! / 2 !. Эффективно переставляя 3 сначала, так как это наиболее ограничительный, а затем переставляя остальные предметы, где есть место.
Также ... полиномиальное время. Это возможно?
ОБНОВЛЕНИЕ: это обсуждается далее по ссылкам ниже. Вышеприведенная проблема называется «подсчетом совершенных совпадений», и каждое вышеуказанное ограничение перестановки представляется {0,1} на матрице слотов для жителей.