I would first put the list in descending order and then do some recursive calls to a search function that will avoid numbers that obviously wouldn't work (in your case, numbers like 90 that are > the target sum).

The following code returns [25, 23, 17, 10].

Code:

def search_for_sum(target_sum, current_sum, number_list, current_list):
count = 0
for num in number_list:
count += 1
if (num + current_sum == target_sum):
current_list.append(num)
return current_list
elif (num + current_sum < target_sum):
current_list.append(num)
result = search_for_sum(target_sum, num + current_sum, number_list[count:], current_list)
if len(result) > 0:
return result
else:
current_list.pop()
return []
if __name__ == '__main__':
## sort the list in descending order
numbers = [90, 30, 25, 23, 17, 15, 10, 8, 1]
target_sum = 75
sum_components = search_for_sum(target_sum, 0, numbers, [])
print sum_components