private int coinChangeRecursiveHelper(int[] coins, int remain, int[] count) {
		if (remain < 0) return -1; // not valid
		if (remain == 0) return 0; // cool, we find the solution
		if (count[remain - 1] != 0) return count[remain - 1]; // we have already visited it, then reuse it.
		
		int min = Integer.MAX_VALUE;
		
		for (int coin : coins) {
			int result = coinChangeRecursiveHelper(coins, remain - coin, count);
			if (result >= 0 && result < min) {
				min = result + 1;
			}
		}
		
		count[remain - 1] = (min == Integer.MAX_VALUE) ? -1 : min;
		
		return count[remain - 1];
	}