Вы ищете количество комбинаций с одним элементом из каждого раздела?
Это просто n1 * n2 * ... * nk.
Edit:
Вы, кажется, также задаете отдельный вопрос:
Учитывая N, как мне назначить n1, n2, ..., nk так, чтобы их произведение было максимальным. На самом деле это не проблема линейной оптимизации, поскольку ваши переменные умножаются вместе.
Это может быть решено с помощью некоторого исчисления, то есть путем взятия частичных производных по каждой из переменных с ограничением с использованием множителей Лагранжа.
В результате n1 .. nk будет как можно ближе к тому же размеру.
if n is a multiple of k, then n_1 = n_2 = ... = n_k = n/k
otherwise, n_1 = n_2 = ... = n_j = Ceiling[n/k]
and n_j+1 = ... = n_k = floor[n/k]
По сути, мы стараемся как можно более равномерно распределить элементы по разделам. Если они делятся поровну, отлично. Если нет, мы делим как можно более равномерно, и с тем, что осталось, мы даем дополнительный элемент каждому первому разделу. (Не обязательно должны быть первые разделы, этот выбор довольно произвольный.) Таким образом, разница в количестве элементов, которыми владеют любые два раздела, будет не более одного.
Гори Подробнее :
Это функция продукта, которую мы хотим максимизировать:
P = n1 * n2 * ... nK
Мы определяем новую функцию, используя множители Лагранжа:
Лямбда = P + 1 (N - n1 - n2 ... -nk)
И взять частичные производные в каждой из k n_i переменных:
dLambda / dn_i = P / n_i - l
и в л:
dLambda / dl = N - n1 -n2 ... -nk
установив все частные производные = 0, мы получим систему из k + 1 уравнений, и когда мы решим их, мы получим, что n1 = n2 = ... = nk
Некоторые полезные ссылки:
Множители Лагранжа
Оптимизация