JSFiddle - React, Tailwind, and code Playground
TypeScript
/*
Дан массив номинала монет (например 1, 2, 5, 10 рублей) и сумма денег.
Необходимо вернуть минимальное количество монет имеющихся номиналов,
сумма которых равна искомой. Если ее нельзя набрать имеющимися монетами,
то выкинуть ошибку.
Примеры:
getMinimumCoins([1, 9, 10], 28) -> 3 (две монеты по 9 рублей,
одна монета 10 рублей)
getMinimumCoins([1, 2, 5, 10], 74) -> 9 (7 монет по 10 рублей, 2 монеты по 2 рубля)
getMinimumCoins([10, 20, 30], 13) -> error
*/
function getMinimumCoins(coins, sum) {
const arr = [];
for (const coin of coins) {
arr[coin] = 1;
}
for (let i = 1; i <= sum; i += 1) {
if (arr[i]) continue;
let min = Number.POSITIVE_INFINITY;
for (let j = 1; j < i / 2; j += 1) {
const k = i - j;
if (!arr[j] || !arr[k]) continue;
min = Math.min(min, arr[j] + arr[k]);
}
if (min !== Number.POSITIVE_INFINITY) {
arr[i] = min;
}
}
if (arr[sum]) return arr[sum];
throw new Error('cant compute coins!')
}
console.log(getMinimumCoins([1, 9, 10], 28));