,并使阵列Counts[Sum+1]
其中总和为所有元素
设置Counts[0] = 1
,其他元素的总和 - 零
对于以往x=arr[i]
扫描从最终计数阵列,并增加这些条目,这可以从现有迄今数额和x
组成
if Counts[j - arr[i]] > 0 then //this check might be omitted
Counts[j] = Counts[j - arr[i]] + Counts[j]
然后总结非零计数条目j>=k
复杂性是O(Sum * N)
如果可能的和的范围很大,但可能的和的数量不那么高(如arr=[1, 2, 3, 100000000, 100000001]
阵列),则可以利用记忆化方法,并仅存储真正现有的变体在图
实施例:
arr=[1,2,3,5]
Counts = [1,0,0,0,0,0,0,0,0,0,0,0]
after arr[0]=1
Counts = [1,1,0,0,0,0,0,0,0,0,0,0]
after arr[1]=2
Counts = [1,1,1,1,0,0,0,0,0,0,0,0]
after arr[2]=3
Counts = [1,1,1,2,1,1,1,0,0,0,0,0]
after arr[3]=5
Counts = [1,1,1,2,1,2,2,1,2,1,1,1]
Counts[8] could be composed from 5 and existing Counts[3] with two variants
1+2+5; 3+5
的元素都是积极的? – Henry
它可以是两者的组合。但为了简单起见,我们只考虑积极因素 – Chandan
@亨利让我们考虑只有积极因素 – Chandan