Возможный дубликат этого вопроса ?
Я думаю этот ответ решает вашу проблему.
Я копирую здесь реализацию решения на python,Но оригинальный ответ предлагает гораздо больше вариантов.Сложность алгоритма растет довольно быстро (экспоненциально), поэтому будьте осторожны, прежде чем использовать его для больших проблем, чем N = 16.
Просто введите все свои счета в список и один из ваших платежей в качестве второго параметра.Вы получите все комбинации счетов-фактур, которые дают данный платеж, а другой платеж - просто недостающие элементы списка.Может быть более одного решения.
def subset_sum(numbers, target, partial=[]):
s = sum(partial)
# check if the partial sum is equals to target
if s == target:
print("sum(%s)=%s" % (partial, target))
if s >= target:
return # if we reach the number why bother to continue
for i in range(len(numbers)):
n = numbers[i]
remaining = numbers[i+1:]
subset_sum(remaining, target, partial + [n])
subset_sum([31,19,80,48,52,70,10,13,12,54,23,45,34,26,51,23,100],193)