Ways To Make Coin Change - DP on Subsequence
Problem Link:
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];
}