,並使陣列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