Skip to content

Instantly share code, notes, and snippets.

@archangel-irk
Created January 24, 2019 11:11
Show Gist options
  • Save archangel-irk/0e585171a662b71d2180d993be2e8aa5 to your computer and use it in GitHub Desktop.
Save archangel-irk/0e585171a662b71d2180d993be2e8aa5 to your computer and use it in GitHub Desktop.
// simple "hungry" solution
let denominations = [1, 7, 9];
function withdraw(amount) {
let remain = amount;
let result = [];
const denominationsSorted = denominations.sort((a, b) => b - a);
denominationsSorted.forEach((denomination) => {
let count = Math.floor(remain / denomination);
if (count) {
const banknotes = Array(count).fill(denomination);
result.push(...banknotes);
remain -= denomination * count;
}
});
return result.join(' + ');
}
console.log(withdraw(21));
// optimized solution
// let a = [1, 3, 5, 10];
let a = [1, 7, 9];
function withdrawOptimize(n) {
let f = []; // минимальное количество банкнот для выдачи
f[0] = 0;
// m - сумма, которую нужно выдать в момент шага цикла
for (let m = 1; m <= n; m++) {
f[m] = Infinity;
for (let i = 0; i < a.length; i++) {
// 1. Номинал банкноты больше или равен сумме выдачи (можем использовать банкноту)
// 2. `m - a[i]` - Минимальное количество банкнот для выдачи суммы
if (m >= a[i] && f[m - a[i]] + 1 < f[m]) {
f[m] = f[m - a[i]] + 1;
}
}
}
if (f[n] === Infinity) {
console.log('Требуемую сумму выдать невозможно');
return;
}
let result = [];
while (n > 0) {
for (let i = 0; i < a.length; i++) {
// Требуемое количество банкнот для выдачи остатка совпадает с оставшимся количеством банкнот для выдачи
if (f[n - a[i]] === f[n] - 1) {
result.push(a[i]);
n -= a[i];
break;
}
}
}
return result.join(' + ');
}
console.log(withdrawOptimize(21));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment