Все разделы можно найти в 2 этапа.
Первый: из P
создать новый упорядоченный раздел из n, P_S={P_i1, P_i2, ..., P_ip}
, суммируя идентичные i.
P = {1, 1, 1, 1, 2, 2, 5}
P_S = (4, 4, 5)
Создать разделы{C_i1, C_i2, ..., C_ip}
из C
относительно P_S
.Обратите внимание, что C_ix
является множественным, как C
.Он разбивает C на несколько множеств по размерам конечных разделов.
Секунда: для каждого {C_i1, C_i2, ..., C_ip}
и для каждого ix, x={1,2,...,p}
найдите количество разделов C_ix
в t
(число ix's
в P
) наборы с ix
элементами.Позвоните по этому номеру N(C_ix,ix,t)
.
Общее количество разделов:
sum by all {C_i1, C_i2, ..., C_ip} ( product N(C_ix,ix,t) ix={1,2,...,p} )
Первая часть может быть выполнена рекурсивно довольно просто.Второе сложнее.Разделение множества M
на части n
с элементами k
аналогично нахождению всего частично отсортированного списка с элементами из M
.Частично список заказов имеет тип:
a_1_1, a_1_2, ..., a_1_k, a_2_1, a_2_2, ..., a_2_k, ....
Где a_i_x <= a_i_y
, если x < y
и (a_x_1, a_x_2, ..., a_x_k) lexicographic <= (a_y_1, a_y_2, ..., a_y_k)
, если x < y
.С этими двумя условиями можно рекурсивно создать весь раздел из N(C_ix,ix,t)
.
В некоторых случаях N(C_ix,ix,t)
легко вычислить.Определите |C_ix|
как количество различных элементов в множестве C_ix
.
if t = 1 than 1
if |C_ix| = 1 than 1
if |C_ix| = 2 than (let m=minimal number of occurrences of elements in C_ix) floor(m/2) + 1
in general if |C_ix| = 2 than partition of m in numbers <= t.