The coin change problem is a classic dynamic programming problem (unbounded knapsack problem) which can be solved recursively.

N = Coins with different denominations
D = Array of denominations
S = Total amount to make
C = Number of Combinations

Recursive Formula:
C(N, S) = C(N - 1, S) + C(N, S - D[N]);

int Combinations(int denominations[], int coins, int amount) {

	if (coins < 0 || amount < 0) return 0;
	if (amount == 0) return 1;

	return Combinations(denominations, coins - 1, amount) + Combinations(denominations, coins, amount - denominations[coins - 1]);

}