Функция должна возвращать список списков, потому что может быть несколько комбинаций, которые складываются в данную сумму:
def closest(s, A):
if s == 0:
return [[]]
o = []
for i, n in enumerate(A):
if n <= s:
for c in closest(s - n, A[i + 1:]):
o.append([n] + c)
return o
так что:
closest(150, [12, 79, 99, 91, 81, 47])
возвращается:
[[12, 91, 47]]
и это:
closest(10, [4, 5, 6, 2, 1, 3])
возвращается:
[[4, 5, 1], [4, 6], [4, 2, 1, 3], [5, 2, 3], [6, 1, 3]]