【发布时间】:2013-02-17 04:01:27
【问题描述】:
假设您有一个数组,其中包含您知道的所有元素都是正数,并且小于数字 N。
谁能给我一个算法的一般高级描述,以确定数组中是否存在某个子集,其中所有元素加起来正好为 N?
不需要特别高效;我正在使用的集合非常小。
【问题讨论】:
标签: sum set subset-sum array-algorithms
假设您有一个数组,其中包含您知道的所有元素都是正数,并且小于数字 N。
谁能给我一个算法的一般高级描述,以确定数组中是否存在某个子集,其中所有元素加起来正好为 N?
不需要特别高效;我正在使用的集合非常小。
【问题讨论】:
标签: sum set subset-sum array-algorithms
如果效率不重要,高级算法是:
input: array A[1..K] of positive numbers, positive N
for each subset S of { 1..K }
sum = 0
for each i in S
sum = sum + A[i]
end
if (sum equals N) return true
end
return false
【讨论】:
伪代码。效率极低。
if empty(numbers) return false
return hasSumSubset(numbers, N)
boolean hasSumSubset(numbers[], N):
p = pop(numbers)
if empty(numbers) return N == p
return hasSumSubset(numbers, N-p) or hasSumSubset(numbers, N)
如果您确实实现了这一点,请确保为递归调用复制 numbers(不是通过 ref 传入);否则将无法正常工作。
【讨论】: