对于这个数量的分区递归P(n,s,x)
holds:
P(n,s,x) = sum P(n-i*x, s-i, x-1), for i=0,...,s
P(0,0,x) = 1
P(n,s,x) = 0, if n <= 0 or s <= 0 or x <= 0
计算效率不高,也许在你的例子中它会足够快。
最好使用记忆法来实现。
Edit:
具有记忆功能的 Python 实现:
D = {}
def P(n,s,x):
if n > s*x or x <= 0: return 0
if n == s*x: return 1
if (n,s,x) not in D:
D[(n,s,x)] = sum(P(n-i*x, s-i, x-1) for i in xrange(s))
return D[(n,s,x)]
P(100, 10, 42)
2685871
Update:
满足参数的分区n,s,x
可以有i
最大尺寸的分区x
。
通过删除这些i
有尺寸的零件x
我们在参数方面遇到了同样的问题n-i*x, s-i, x-1
。
例如。 100 的分区有 10 个部分,42 作为最大部分,可以有 0、1 或 2 个大小为 42 的部分。
P(0,0,x) = 1
意味着我们在之前的迭代中已经有了分区。
P(n,s,x) = 0, if n>s*x
意味着我们不能用最大大小的所有分区对 n 进行分区,因此参数的组合是不可能的。
边界条件是