找到将数字M分成p部分而没有两部分相等的数字方法的算法是什么。 例: M = 5,P = 2 它们是(1,4)(2,3)。如果P = 3则没有可用的分区,即 不是(1,2,2)因为分区中有两个2。
答案 0 :(得分:0)
在扩展产品中
(1 + X)(1 + X 2 )(1 + X 3 )...(1 + X 名词)
找到x ^ n的系数。这给出了将n表示为不同数字之和的任何可能性的数量,即,可变数量的项。
您希望拥有可能的数量
n = i 1 + i 2 + ... + i P ,其中i 1 < i 2 < ......<我 P 子>
可以通过设置
来实现i 1 = j 1 ,i 2 = i 1 + j 2 = j 1 + j 2 ,...
I <子> P 子> = I P-1 子> + J <子> P 子> = j的<子> 1 子> + J <子> 2 + ... + j P ,所有j k &gt; 0
这样原始任务就像计算一个人可以解决的所有方式一样
n = P * j 1 +(P-1)* j 2 + ... + 1 * j P 全部j k &gt; 0,但彼此无关。
相应的生成函数是x的幂的几何级数的乘积,省略了常数项,
(x + x 2 + x 3 + ...)*(x 2 + x 4 + x 6 + ...)*(x 3 + x 6 + x 9 + .. 。)* ... *(x P + x 2 * P + x 3 * P + ...)
= x P *(P + 1)/ 2 *(1 + x + x 2 + ...)*(1 + x 2 + x 4 + ...)*(1 + x 3 + x 6 + ...)* .. 。*(1 + x P + x 2 * P + ...)
显然,需要n> = P *(P + 1)/ 2来获得任何解决方案。对于P = 3,边界是n> = 6,因此在这种情况下n = 5确实没有解。
算法
count = new double[N]
for k=0..N-1 do count[k] = 1
for j=2..P do
for k=j..N-1 do
count[k] += count[k-j]
然后count [k]包含n = P *(P + 1)/ 2 + k的组合数。