给定一系列整数具有关系,其中一个数字等于前两个数字的总和,并且起始整数是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。
答案 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]
这个"可变数量的循环"看起来无法实现,但实际上可以使用长度为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
元素等于p
和a
为元素数组的方式数。然后
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