Наблюдение, которое поможет вам, состоит в том, что если ваш список {a, b, c ...} и число, которое вы хотите проверить, является x, то x можно записать как сумму подсписка, только если любой из x или xa можно записать как сумму подсписка {b, c, ...}. Это позволяет вам написать очень простой рекурсивный алгоритм для решения проблемы.
edit: вот код, с учетом комментариев ниже. Не проверено, поэтому, вероятно, глючит; и не обязательно самый быстрый. Но для небольшого набора данных он сделает работу аккуратно.
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));
}