Если вы рассматриваете каждую деноминацию как точку на основе числа n, где n - максимальное количество нот, которое вам понадобится, вы можете увеличивать это число до тех пор, пока не исчерпаете пространство проблемы или не найдете решение.
Максимальное количество нот, которое вам понадобится, равно сумме, которая вам требуется, деленной на банкноту с наименьшим номиналом.
Это грубая реакция на проблему, но она определенно сработает.
Вот немного p-кода. Я, наверное, повсюду со своими столбами забора, и это настолько неоптимизировано, чтобы быть смешным, но это должно работать. Я думаю, идея в любом случае верна.
Denominations = [10,20,50,100]
Required = 570
Denominations = sort(Denominations)
iBase = integer (Required / Denominations[1])
BumpList = array [Denominations.count]
BumpList.Clear
repeat
iTotal = 0
for iAdd = 1 to Bumplist.size
iTotal = iTotal + bumplist [iAdd] * Denominations[iAdd]
loop
if iTotal = Required then exit true
//this bit should be like a mileometer.
//We add 1 to each wheel, and trip over to the next wheel when it gets to iBase
finished = true
for iPos from bumplist.last to bumplist.first
if bumplist[iPos] = (iBase-1) then bumplist[iPos] = 0
else begin
finished = false
bumplist[iPos] = bumplist[iPos]+1
exit for
end
loop
until (finished)
exit false