money
by krustnic
JavaScript
const moneyTypes = [5000, 1000, 500, 100, 30];
const moneyLimits = {
5000: 1,
1000: 2,
500: 2,
100: 2,
30: 5
}
function getMoney(amount, out) {
if (amount === 0) return out
for(const m of moneyTypes) {
if (m <= amount && (moneyLimits[m] - (out[m] || 0) - 1 >= 0)) {
out[m] = (out[m] || 0) + 1
return getMoney(amount - m, out)
}
}
throw Error("No money")
}
function minInArray(arr, field) {
return arr.reduce((min, n) => {
if (min[field] > n[field]) return n
return min
})
}
function R(s, m) {
this.s = s
this.m = m
}
function minM(amount, s, out) {
for(const m of moneyTypes) {
if (amount === m) {
return new R(1, m)
}
}
let arr = []
for(const m of moneyTypes) {
if (m <= amount) {
const v = minM(amount - m, s, out)
if (v !== null) {
arr.push(new R(s.s + 1 + v.s, m))
}
}
}
if (arr.length === 0) return null
const r = minInArray(arr, 's')
out[r.m] = (out[r.m] || 0) + 1
// s = Math.min(...arr)
return r
}
/* function minM(amount, s) {
for(const m of moneyTypes) {
if (amount === m) return 1
}
let arr = []
for(const m of moneyTypes) {
if (m <= amount) {
const v = minM(amount - m, s)
if (v !== null) {
arr.push(s + 1 + v)
}
}
}
if (arr.length === 0) return null
s = Math.min(...arr)
return s
}
*/
const value = 230
// const r = getMoney(value, {})
// console.log(r)
const out = {}
const p = minM(value, 0, out)
console.log(out)