change = (amount, coins, n = (coins.length), memo = initMemo(coins, amount)) => {
    const isBaseCase1 = (n === 0);
    if (isBaseCase1) return 0;

    const isBaseCase2 = (amount === 0);
    if (isBaseCase2) return 1;

    const hasSeen = (memo[n][amount] !== null);
    if (hasSeen) return memo[n][amount];

    return dfs(amount, coins, n, memo);/* Time O(N * AMOUNT) | Space O((N * AMOUNT) + HEIGHT) */
}
DP - Top Down
Matrix - Memoization
Time O(N * AMOUNT) | Space O(N * AMOUNT)
https://leetcode.com/problems/coin-change-ii/
@param {number} amount
@param {number[]} coins
@return {number}