Не может быть никакого алгоритма полиномиального порядка для перечисления всех возможных упаковок для вашей задачи, потому что таких упаковок экспоненциально много.Например, с m, n = 3,4, есть 2 ^ (n-1) конфигурации упаковки, которые включают все n элементов: {abcd}, {a} {bcd}, {ab} {cd}, {abc}{d}, {a} {b} {cd}, {a} {bc} {d}, {ab} {c} {d}, {a} {b} {c} {d}.(Предположительно, наборы не различаются; например, {abc} {d} эквивалентны {d} {abc}. Если наборы различаются , в следующем методе просто подсчитайте, не исключая подсчетов, то есть не применяет никаких правил.)
Остальная часть этого ответа может дать некоторые идеи или основу для решения проблемы, но (как есть) может быть не особенно эффективной.
Один из способов перечисления всех допустимых случаев - это подсчет базового числа m + 1 H от H = 0 до доли (m + 1) ^ n, применяя некоторые правила для выбора допустимых конфигураций.Пусть dj обозначает j-ю цифру H, с d.1 наименее значимым.Если dj равно 0, элемент j
является членом множества no;если dj = k> 0, j
является членом множества k
.Пусть Ai (H) = самое высокое положение цифры i
в H или -i
, если i
не происходит;требуют Ai> A. (i + 1).A (H) может поддерживаться и тестироваться постепенно за время O (1), когда H считает.Например, чтобы исключить 1323 (== 1232) в следующем примере (ручной работы), обратите внимание, что A.2 (1323) = 2 <3 = A.3 (1323).</p>
Пример: n = 4 = #elements;m = 3 = #sets;H-последовательность с неотличимыми наборами должна быть: 0000, 0001, 0010, 0011, 0012, 0100, 0101, 0102, 0110, 0111, 0112, 0120, 0121, 0122, 0123, 1000, 1001, 1010, 1011, 1012, 11001101, 1102, 1110, 1111, 1112, 1120, 1121, 1122, 1123, 1200, 1201, 1202, 1203, 1210, 1211, 1212, 1213, 1220, 1221, 1222, 1223, 1230, 1231, 1232, 1233.