k个元素之和等于p的方式的数量

时间:2016-05-13 04:57:27

标签: arrays algorithm recursion dynamic-programming

给定一系列整数具有关系,其中一个数字等于前两个数字的总和,并且起始整数是1

  

系列 - > 1,2,3,5,8,13,21,34,55

找到k个元素之和等于p的方式的数量。我们可以多次使用一个元素。

  

P = 8

     

K = 4。

所以,方法的数量是4.Those,

  

1,1,1,5

     

1,1,3,3-

     

1,2,2,3-

     

2,2,2,2

我能够通过递归来解决这个问题。我在这里感觉到动态编程,但我没有得到如何去做。可以在更短的时间内完成???

编辑我忘了提及数字的顺序并不重要,将被计算一次。对于ex = 3->(1,2)和(2,1)。方法的数量仅为1。

3 个答案:

答案 0 :(得分:0)

编辑:自发布以来,海报已更改原始问题。我的算法仍然有效,但也许可以改进。原始问题有n个任意输入数字(他现在已将其修改为Fibonacci系列)。要将我的算法应用于修改后的帖子,请仅使用小于p的元素截断系列(假设有n个元素)。

这是一个n^(k/2)算法。 (n是系列中元素的数量)

使用长度为p的表格,以便table[i]包含总计为k/2的{​​{1}}元素的所有组合。例如,在您提供的示例数据中,i包含table[4]{1,3}

编辑:如果空间过高,可以使用有序链接列表完成相同的算法,您只能存储非空表条目。链表必须是两个方向:前进和后退,这使算法的最后一步更清晰。

计算完这个表之后,只要两个都是非空的,我们就会通过将每个{2,2}与每个table[j]相结合来获得所有解决方案。

要获取表格,请将整个内容初始化为空。然后:

table[p-j]

这个&#34;可变数量的循环&#34;看起来无法实现,但实际上可以使用长度为For i_1 = 0 to n-1: For i_2 = i_1 to n-1: ... For i_k/2 = i_k/2-1 to n-1: sum = series[i_1] + ... + series[i_k/2] if sum <= p: store {i_1, i_2, ... , i_k/2 } in table[sum] 的数组来跟踪每个i_`的位置。

让我们回到您的数据,看看我们的表格如何:

k/2

通过将table[2] = {1,1} table[3] = {1,2} table[4] = {1,3} and {2,2} table[5] = {2,3} table[6] = {1,5} table[7] = {2,5} table[8] = {3,5} table[2]table[6]table[3]table[5]table[4]相结合,可以找到解决方案。因此,解决方案是:{1,1,1,5} {1,2,2,3},{1,1,3,3},{2,2,2,2},{1,3,2 ,2}。

答案 1 :(得分:0)

您可以使用动态编程。设C(p, k)为求k元素等于pa为元素数组的方式数。然后

 C(p, k) = C(p - a[0], k - 1) + C(p - a[1], k - 1) + .... + C(p - a[n-1], k - 1)

然后,您可以使用记忆加速代码。

答案 2 :(得分:0)

提示:

你的问题众所周知。它是总和问题,是背包问题的变种。检查这个很好的解释。 sum-set problem