1- function change ( coins , amount ) {
1+ function change ( coins , amount ) {
22 const combinations = new Array ( amount + 1 ) . fill ( 0 )
33 combinations [ 0 ] = 1
44
@@ -12,7 +12,47 @@ function change (coins, amount) {
1212 return combinations [ amount ]
1313}
1414
15- function minimumCoins ( coins , amount ) {
15+ /** Coin-change combination using recursive approach along with Memoization
16+ * @param {number } amount
17+ * @param {number[] } coins
18+ */
19+ const changeRecursive = ( amount , coins ) => {
20+ const mem = new Map ( )
21+ return coinChangeComb ( amount , coins , 0 , mem )
22+ }
23+ /** Coin-change combination using recursive approach along with Memoization
24+ * @param {number } amount
25+ * @param {number[] } coins
26+ * @param {number } idx
27+ * @param {Map } mem
28+ */
29+
30+ const coinChangeComb = ( amount , coins , idx , mem ) => {
31+ // Negative Base Case
32+ if ( amount < 0 || idx === coins . length ) {
33+ return 0
34+ }
35+ // Positive Base Case
36+ if ( amount === 0 ) {
37+ return 1
38+ }
39+
40+ // Main Case
41+ // Check if the recursive function call results is already memoized
42+ if ( mem . has ( `${ amount } - ${ idx } ` ) ) {
43+ return mem . get ( `${ amount } - ${ idx } ` )
44+ }
45+ let res = 0
46+ // Consider the coin at index idx
47+ res += coinChangeComb ( amount - coins [ idx ] , coins , idx , mem )
48+ // Leave the coin at index idx
49+ res += coinChangeComb ( amount , coins , idx + 1 , mem )
50+ // Cache the intermediate result in mem
51+ mem . set ( `${ amount } - ${ idx } ` , res )
52+ return res
53+ }
54+
55+ function minimumCoins ( coins , amount ) {
1656 // minimumCoins[i] will store the minimum coins needed for amount i
1757 const minimumCoins = new Array ( amount + 1 ) . fill ( 0 )
1858
@@ -26,7 +66,10 @@ function minimumCoins (coins, amount) {
2666 const coin = coins [ j ]
2767 if ( coin <= i ) {
2868 const subRes = minimumCoins [ i - coin ]
29- if ( subRes !== Number . MAX_SAFE_INTEGER && subRes + 1 < minimumCoins [ i ] ) {
69+ if (
70+ subRes !== Number . MAX_SAFE_INTEGER &&
71+ subRes + 1 < minimumCoins [ i ]
72+ ) {
3073 minimumCoins [ i ] = subRes + 1
3174 }
3275 }
@@ -35,11 +78,27 @@ function minimumCoins (coins, amount) {
3578 return minimumCoins [ amount ]
3679}
3780
38- function main ( ) {
81+ function main ( ) {
3982 const amount = 12
4083 const coins = [ 2 , 4 , 5 ]
41- console . log ( 'Number of combinations of getting change for ' + amount + ' is: ' + change ( coins , amount ) )
42- console . log ( 'Minimum number of coins required for amount :' + amount + ' is: ' + minimumCoins ( coins , amount ) )
84+ console . log (
85+ 'Number of combinations of getting change for ' +
86+ amount +
87+ ' is: ' +
88+ change ( coins , amount )
89+ )
90+ console . log (
91+ 'Number of combinations of getting change for ' +
92+ amount +
93+ ' is: ' +
94+ changeRecursive ( coins , amount )
95+ )
96+ console . log (
97+ 'Minimum number of coins required for amount :' +
98+ amount +
99+ ' is: ' +
100+ minimumCoins ( coins , amount )
101+ )
43102}
44103
45104main ( )
0 commit comments