public int coinChange(int[] coins, int amount) {
return coinChange(coins, amount, 0, new Integer[amount+1]);
}
private int coinChange(int[] coins, int remaining, int start, Integer[] memo){
if(remaining == 0){
return 0;
}
if(remaining<0){
return -1;
}
if(memo[remaining]!=null){
return memo[remaining];
}
int min = Integer.MAX_VALUE;
//but if I am running loop from i=0 it passes , I think it should work from start as well, as it already discover the optimal min in previous steps for example for [5,1,3,2] coins denominations ,if I have to make 11 than going from 5 exploring 3, is same as going from 3 exploring 5, that's why I am staring from start.
for(int i=start; i<coins.length; i++){
int res = coinChange(coins, remaining-coins[i], i, memo);
if(res>=0){
min = Math.min(min, res+1);
}
}
min = ((min == Integer.MAX_VALUE) ? -1:min);
return memo[remaining] = min;
}