繁体   English   中英

从 n 个元素的数组中找出形成元素 K 的方法数

[英]Find the number of ways to form an element K from an array of n elements

给定一个包含n元素的数组,找出从这n元素形成元素K的方法数。 例如,如果数组为{3,9,1,4,2,5}K = 5可能的方式有:

1+4,
2+3,
1+2+2,
1+1+1+1+1,
1+3+1,
1+1+1+2

所以答案应该是 6。请为此提出一个算法。

基本算法如下所示:

  • 对于数组中的每个元素x
    • 如果x等于k ,则[x]是一个解
    • 如果x小于k ,则找到kx的解并将它们与x组合

在代码中实现这一点的最简单方法是作为一个简单的递归算法(这里是 Python):

def find_sums(array, k):
    for x in array:
        if x == k:
            yield [x]
        elif x < k:
            for s in find_sums(array, k - x):
                yield [x] + s

但是请注意,这对于较大的数组来说效率不高,因为所有对find_sums(array, k - x)调用find_sums(array, k - x)一遍又一遍地重复,但这可以通过记忆化动态编程轻松修复 此外,结果可能包含一些“重复项”,例如[1, 4][4, 1] 您可以通过构造来避免这些(跟踪部分结果中的最大元素)或之后将它们过滤掉(例如,排序并转换为集合)。 此外,如果您不希望结果中出现单数列表,您也必须将它们过滤掉。

这些调整留给读者作为练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM