Coin Change

Coin Change

Ways To Make Coin Change - DP on Subsequence

https://www.codingninjas.com/studio/problems/ways-to-make-coin-change_630471?utm_source=striver&utm_medium=website&utm_campaign=a_zcoursetuf

My approach:

Everything remains same as we did on other questions involving DP on subsequences.

However in this we are aloowed to use elements multiple times.

When the sample space become infinity we don't move the pointer.

So in 'take' case just make a minor change:

instead of i-1, we will let it be i

f(i-1) -> f(i)

Code:

Memoization:

int mod = 1e9+7;
long helper(int* denominations, int i, int value, vector<vector<long>> &dp){

    if(i==0){
        if(value%denominations[i]==0){
            return 1;
        }
        return 0;
    }

    if(dp[i][value]!=-1){
        return dp[i][value];
    }

    long int notTake = helper(denominations,i-1,value,dp);
    long int take = 0;

    if(denominations[i]<=value){
        take = helper(denominations,i,value-denominations[i],dp);
    }

    dp[i][value] = notTake+take;

    return notTake+take;
}

long countWaysToMakeChange(int *denominations, int n, int value)
{
    //Write your code here

    vector<vector<long>> dp(n, vector<long>(value+1, -1));

    return helper(denominations,n-1,value,dp);
}

Tabulation:

long countWaysToMakeChange(int *denominations, int n, int value)
{
    //Write your code here

    vector<vector<long>> dp(n, vector<long>(value+1, 0));

    for(int i=1;i<=value;i++){
        if(i%denominations[0]==0){
            dp[0][i] = 1;
        }
    }

    for(int i=0;i<n;i++){
        dp[i][0] = 1;
    }

    for(int i=1;i<n;i++){
        for(int j=1;j<=value;j++){
            long notTake = dp[i-1][j];
            long take = 0;
            if(denominations[i]<=j){
                take = dp[i][j-denominations[i]];
            }
            dp[i][j] = take+notTake;
        }
    }

    return dp[n-1][value];
}