剛看到這個問題我就隱約回憶起了cs170時候學過的subset問題,然后我發現我完全不記得那個東西是怎么做的。【感覺都是套路阿,都拿這種困擾計算機多年的大題叫人面試即興做】
Dynamic Programming implementation.
Idea: 先要identify子問題。 這個跟簡單版DP不太一樣,簡單的DP 子問題就一個參數,這里兩個參數。 1個是子的target sum. 還有一個是子的given array.?
也就是比如說原本我們要判斷target sum =100, array size =0--1000 elements.
我們可以拆分成小的問題,假如target只要10, given array 10個數,能不能sum 出這個結果。
最后是identify subproblem之間的進階關系:
如果target sum i>= set[j-1], 比input array 只看到j-1這個元素,要大。我們進行判斷:
?target sum=i, array size=0...j的答案要嘛完全等于上一輪的結果,要嘛等于等于子問題
subsets[i-set(j-1)[j-1]]的結果。
復習完subset sum問題之后再看這道題就簡單很多。(其實也不能說簡單很多吧hhh)
最關鍵的是如何把這道題變成subset sum problem. 我們缺的東西就是target sum。 這個如果花一點時間想就知道target sum 其實就是所有數字加起來除2.?
最tricky的一點就是要判斷target sum是否能被2整除。 如果不行,直接不用判斷了。