diff --git a/Dynamic-Programming/CoinChange.js b/Dynamic-Programming/CoinChange.js index d320e20db..35825d7fb 100644 --- a/Dynamic-Programming/CoinChange.js +++ b/Dynamic-Programming/CoinChange.js @@ -15,3 +15,19 @@ export const change = (coins, amount) => { } return combinations[amount] } +/** + * @params {Array} coins + * @params {Number} amount + */ +export const coinChangeMin = (coins, amount) => { + const map = { 0: 1 } + for (let i = 1; i <= amount; i++) { + let min = Infinity + for (const coin of coins) { + if (i < coin) continue + min = Math.min(min, 1 + map[i - coin]) + } + map[i] = min + } + return map[amount] === Infinity ? -1 : map[amount] - 1 +} diff --git a/Dynamic-Programming/tests/CoinChange.test.js b/Dynamic-Programming/tests/CoinChange.test.js index dc98c68c9..6df3c66a3 100644 --- a/Dynamic-Programming/tests/CoinChange.test.js +++ b/Dynamic-Programming/tests/CoinChange.test.js @@ -1,37 +1,44 @@ -import { change } from '../CoinChange' +import { change, coinChangeMin } from '../CoinChange' test('Base Case 1', () => { const coins = [2, 3, 5] const amount = 0 expect(change(coins, amount)).toBe(1) + expect(coinChangeMin(coins, amount)).toBe(0) }) test('Base Case 2', () => { const coins = [] const amount = 100 expect(change(coins, amount)).toBe(0) + expect(coinChangeMin(coins, amount)).toBe(-1) }) test('Test Case 1', () => { const coins = [2, 4, 5] const amount = 12 expect(change(coins, amount)).toBe(5) + expect(coinChangeMin(coins, amount)).toBe(3) }) test('Test Case 2', () => { const coins = [5, 2, 3, 7, 6, 1, 12, 11, 9, 15] const amount = 45 expect(change(coins, amount)).toBe(12372) + expect(coinChangeMin(coins, amount)).toBe(3) }) test('Test Case 3', () => { const coins = [2] const amount = 3 expect(change(coins, amount)).toBe(0) + expect(coinChangeMin(coins, amount)).toBe(-1) }) test('Test Case 4', () => { const coins = [3, 5, 7, 8, 9, 10, 11] const amount = 500 expect(change(coins, amount)).toBe(35502874) + expect(coinChangeMin(coins, amount)).toBe(46) }) test('Test Case 5', () => { const coins = [10] const amount = 10 expect(change(coins, amount)).toBe(1) + expect(coinChangeMin(coins, amount)).toBe(1) })