Q22 Coin Change II - LeetCode 518

PHOTO EMBED

Sat Sep 09 2023 15:13:06 GMT+0000 (Coordinated Universal Time)

Saved by @Ayush_dabas07

class Solution {
    //Q21
    public int change(int amount, int[] coins) {
        int n = coins.length;
        // return solve(coins , n-1 , amount , new Integer[n][amount+1]);

        //tabulization -> n*amt | sc- n*amt
        int dp[][] = new int[n][amount+1];
        for(int i = 0 ;i < n ; i++){
            for(int j =0 ; j < amount+1 ; j++){
                if(i == 0){
                    if(j%coins[i] == 0)
                    dp[i][j] = 1;

                    else
                    dp[i][j] = 0;
                }
                else{
                     int notake = dp[i-1][j];
                    int take = 0;
                    if(j - coins[i] >= 0)
                    take = dp[i][j-coins[i]];

                    dp[i][j] = take + notake;
                }
            }
        }
        return dp[n-1][amount];
    }

    /* by trying each coin on amount multiple times we get combonition as no coin gets 
    repeated
        by trying all coins on amount multiple times we get permutation as coins gets
        repeated
    */
    //Recursion-> exponential(can't determine no. of options) | 
    //Memoization -> n*amt Sc-> n*amt + amt(stack height)
     public int solve(int coins[] , int i ,int amt , Integer[][] dp){
        if(i == 0){
            if(amt % coins[i] == 0)
            return 1;

            else
            return 0;
        }
        if(dp[i][amt] != null)
        return dp[i][amt];
        
        //faith calls for all ways if we take or not take from next level
        int notake = solve(coins , i-1 , amt , dp);
        int take = 0;
        if(amt - coins[i] >= 0)
        take = solve(coins , i , amt  - coins[i] ,dp);

        return dp[i][amt] = take + notake;
    }
}
content_copyCOPY

https://leetcode.com/problems/coin-change-ii/