JSFiddle - React, Tailwind, and code Playground
by krustnic
JavaScript
const moneyTypes = [5000, 1000, 500, 100, 30];
const moneyLimits = {
5000: 1,
1000: 1,
500: 1,
100: 5,
30: 5
}
function sortByLength(arr) {
const newArr = arr.slice(0)
return newArr.sort((a, b) => {
return a.length - b.length
})
}
function minM(amount, limits) {
let arr = []
for(const m of moneyTypes) {
if (m <= amount && limits[m] - 1 >= 0) {
if (amount === m) {
return [ m ]
}
const localLimits = Object.assign({}, limits)
localLimits[m] -= 1
const v = minM(amount - m, localLimits)
if (v !== null) {
arr.push([m].concat(v))
// optimization
if (v.length < 1000) break
}
}
}
if (arr.length === 0) return null
return sortByLength(arr)[0]
}
const value = 6460
console.log("start")
const p = minM(value, moneyLimits)
console.log('R: ', p)