int findMinRecursive(int []coins, int value, int[] dp){
        
        if(value<0) return Integer.MAX_VALUE;
        
        if(value==0)return 0; // if value is 0, we came up with solution then, just return
        
        if(dp[value]!=0) return dp[value]; // if already calculated, use it
        
        int min=Integer.MAX_VALUE;
        
        for(int i=0; i<coins.length; i++){
            int res= findMinRecursive(coins, value - coins[i], dp);
            min=Math.min(min, res);
        }
        
        if(min!=Integer.MAX_VALUE)
          dp[value]=min+1;
        else 
            dp[value]=Integer.MAX_VALUE;
        return dp[value];
    }
This is DP solution, using bottom up approach we can identify how many coins take to make up given value.
src/problems/medium/CoinChange.java