money 2

by krustnic

JavaScript

const moneyTypes = [5000, 1000, 500, 100, 30];
const moneyLimits = {
	5000: 1, 
  1000: 2, 
  500: 2, 
  100: 2, 
  30: 5
}

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, out) {  
  out = out || {
  	5000: 0, 
    1000: 0, 
    500: 0, 
    100: 0, 
    30: 0
  }
  
	for(const m of moneyTypes) {
  	if (amount === m) {  
      out[m] += 1;
      return new R(1, out)
    }
  }
  
  let arr = []
  for(const m of moneyTypes) {
  	if (m <= amount) {
    	const v = minM(amount - m, out)
      if (v !== null) {  
        console.log(v)
      	const sum = Object.values(out).reduce((total, i) => {return total + i}, 0)
      	arr.push(new R(sum + 1 + v.s, v.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
}

const value = 200

const p = minM(value)
console.log('R: ', p)