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)