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)