用于查找数字可以写为两个或更多个正数之和的方法的算法

时间:2015-04-29 00:06:28

标签: recursion dynamic-programming memoization integer-partition

这是一个家庭作业问题,必须使用动态编程方法解决。

到目前为止,我设法做到的是:

设f(x)表示x可写的次数:

然后f(x)= f(x - 1)+ 1; f(5)= f(4)+ 1(5 = 4 + 1)

但我不认为这是正确的方法。有人想帮忙吗?

问题的真实例子是:

可编写的方式4:

4: 3 + 1
4: (2 + 1) + 1
4: 2 + 2
4: (1 + 1) + (1 + 1)

1 个答案:

答案 0 :(得分:2)

此表示形式为partition。它可以通过不同的方式解决。

例如,假设

f(x, m) - number of partitions of x 
such that the largest number in that partition is m

然后

f(x, m) = sum of all f(x - m, k) where (1 <= k <= m),
also (k<=x-m), because f(x, y) = 0 where (y > x)

为你的例子(让我们将数字本身计算为一个分区(f(x,x)= 1))

f(1, 1) = 1
f(2, 1) = f(1, 1) = 1
f(2, 2) = 1
f(3, 1) = f(2, 1) = 1
f(3, 2) = f(1, 1) = 1 //+ f(1, 2) zero
f(4, 1) = f(3, 1) = 1 
f(4, 2) = f(2, 1) + f(2, 2) = 2
f(4, 3) = f(1, 1) = 1 // + f(1, 2) + f(1, 3) zeroes
f(4, 4) = 1

所以f(4,1),f(4,2),f(4,3),f(4,4)= 5的总和(4如果不算4本身就是一个分区)