Алгоритм "в лоб" предельно прост. Пускаем бесконечный цикл, пока оставшаяся сумма не станет равной 0. Вычитаем из нее каждый шаг самый большой номинал. Если сумма получилась отрицательной, то берем следующий номинал поменьше. Как только стала положительной, сохраняем остаток в переменную, где у нас была первоначальная сумма и идем на новую итерацию.
Что-то типа того (не окончательный вариант без кэширования) выглядит так:

Код AS3:
while (sum > 0) {
for (var i:uint = 0; i < nominalList.length; i++) {
if ((sum - nominalList[i]) >= 0) {
sum -= nominalList[i];
resultList.push(nominalList[i]);
break;
}
}
}