假设 S 是子集和数组,A 是原始数组。我假设 S 已排序。
|A| = log2(|S|)
S[0] = 0
S[1] = A[0]
S[2] = A[1]
S[3] = EITHER A[2] OR A[0] + A[1].
一般来说,i >= 3 的 S[i] 要么是 A 的一个元素,要么是您已经遇到的 A 元素的组合。处理 S 时,对生成给定数字的 A 的已知元素的每个组合跳过一次,将任何剩余数字添加到 A。当 A 达到正确的大小时停止。
例如,如果 A=[1,2,7,8,9],则 S 将包括 [1,2,1+2=3,...,1+8=9, 2+7=9,9,。 ..]。在处理 S 时,由于 1+8 和 2+7,我们跳过了两个 9,然后看到第三个 9,我们知道它一定属于 A。
例如,如果 S=[0,1,1,2,8,9,9,10] 那么我们知道 A 有 3 个元素,A 的前 2 个元素是 [1,1],当我们达到 2 时,我们跳过它,因为 1+1=2,我们追加 8,我们就完成了,因为我们有 3 个元素。