まず、目的の数に合計されるサブセットがあるかどうかを見つけることでさえ、NP完全であり、サブセット合計問題として知られているため、そのための既知の多項式解はないことに注意してください。
さて、特定の問題に関して、ここにいくつかのオプションがあります:
まず、もちろん「すべてのサブセットを生成して合計をチェックする」方法があります。要素がすべて非負である場合、実際にそれらを開発する前に、分枝限定法を使用して可能性の大部分を終了できることに注意してください(でサブセットX
を見つけsum(X) == s
、数を探している場合n < s
-あなたは確信することができますを含むセットX
は解決策を見つけられません)。次のようなもの:
findSubsets(list,sol,n):
if (list.empty() and n == 0): #found a feasible subset!
print sol
return
else if (n < 0): #bounding non feasible solutions
return
else if (list.empty()): #a solution that sums to a smaller number then n
return
e <- list.removeAndReturnFirst()
sol <- sol.add(e)
findSubsets(list,sol,n-e)
sol <- sol.removeLast()
findSubsets(list,sol,n)
list.addFirst(e) #cleanup, return the list to original state
はアイテムのリストであり、findSubsets(list,[],n)
は目的の番号であり、は空のリストです。を使用して呼び出します。list
n
[]
必要に応じて簡単に並列化できることに注意してください。調査した2つのサブセット間で実際の同期は必要ありません。
リストに整数のみが含まれている場合のもう1つの方法は、動的計画法を使用してサブセット和問題を解くことです。マトリックスができたら、テーブルに戻ってテーブルからすべての要素を再作成できます。この同様の質問では、ナップザックDPソリューションからリストを取得する方法について説明しています。2つの問題の原則はほとんど同じです。