設MAX爲數組大小。考慮所有MAX數字的二進制數字;讓數字j的「1」表示「第j個數字包含在總和S中」,而數字j的0表示它不是。
然後有2^MAX可能的解決方案。你可以做一個線性搜索。效率不高。
可以代替修剪做到這一點:
findSolution (Array, MAX, n, S, SolutionSoFar, j) is
if SolutionSoFar has n digits set to 1
if the sum it represents == S
return SolutionSoFar -- we win
else
return false
if (result = findSolution (Array, MAX, n, S, SolutionSoFar with jth set to 1, j+1))
return result
else if (result = findSolution (Array, MAX, n, S, SolutionSoFar with jth set to 0, j+1))
return result
else
return false
findSolution (Array, MAX, n, S, a binary number of MAX digits all 0's, 0)
O型符號仍然會顯示這是指數,但它是更好的。
您現在可以將更多的智能放在這裏:拋出一個項目> S-(n-1)(假定所有項目的大小至少爲1)的解決方案。傾向於添加接近(S-(到目前爲止))/(剩下要添加的項目)的平均值的東西。
如果存在比指數更好的算法,或者我們可以證明沒有,那麼就不得不進一步思考。
http://en.wikipedia.org/wiki/Subset_sum_problem – 2014-09-20 16:50:01
您的問題的標題是誤導。 「X數的總和」當然可以在O(X)時間內計算。 – 2014-09-20 18:02:23
對不起,我不完全確定如何工作。有什麼建議麼? – user3277633 2014-09-20 18:41:33