public List<List<Integer>> get(int[] availableChange, int value) {
    validateInputData(availableChange, value);

    List<List<Integer>> changeCombinations = new LinkedList<List<Integer>>();
    for (int i = 0; i < availableChange.length; i++) {
      int[] availableMoneys = Arrays.copyOfRange(availableChange, 0, availableChange.length - i);
      List<Integer> change = getChange(availableMoneys, value);
      changeCombinations.add(change);
    }
    return changeCombinations;
  }
Combination of an iterative and recursive approach to resolve this problem. We are using
ReturnChange problem to create this algorithm. The complexity order of this algorithm in space
terms is equals to O(N) where N is the number of possible combinations. In time terms, the
complexity order is equals to O(N*M) where N is the number of moneys in the array and M the
complexity order of ReturnChange algorithm.
src/main/java/com/github/pedrovgs/problem49/CombinationsOfChange.java