役立つ観察は、リストが {a, b, c...} で、テストしたい数が x の場合、x または xa のいずれかができる場合にのみ、x をサブリストの合計として書くことができるということです。サブリスト {b, c, ...} の合計として記述されます。これにより、問題を解決するための非常に単純な再帰アルゴリズムを作成できます。
編集:以下のコメントを考慮したコードを次に示します。テストされていないため、おそらくバグがあります。必ずしも最速ではありません。ただし、小さなデータセットの場合は、仕事をうまく終わらせることができます。
bool is_subset_sum(int x, std::list::const_iterator start, std::list::const_iterator end)
{
// for a 1-element list {a} we just need to test a|x
if (start == end) return (x % *start == 0);
// if x is small enough we don't need to bother testing x - a
if (x<a) return is_subset_sum (x, start+1, end);
// the default case. Note that the shortcut properties of || means the process ends as soon as we get a positive.
return (is_subset_sum (x, start+1, end) || is_subset_sum (x-a, start, end));
}