C Program Coin Change
Last Updated :
14 May, 2021
Given a value N, if we want to make change for N cents, and we have infinite supply of each of S = { S1, S2, .. , Sm} valued coins, how many ways can we make the change? The order of coins doesn\’t matter.
For example, for N = 4 and S = {1,2,3}, there are four solutions: {1,1,1,1},{1,1,2},{2,2},{1,3}. So output should be 4. For N = 10 and S = {2, 5, 3, 6}, there are five solutions: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} and {5,5}. So the output should be 5.
C
#include<stdio.h>
int count( int S[], int m, int n )
{
int i, j, x, y;
int table[n+1][m];
for (i=0; i<m; i++)
table[0][i] = 1;
for (i = 1; i < n+1; i++)
{
for (j = 0; j < m; j++)
{
x = (i-S[j] >= 0)? table[i - S[j]][j]: 0;
y = (j >= 1)? table[i][j-1]: 0;
table[i][j] = x + y;
}
}
return table[n][m-1];
}
int main()
{
int arr[] = {1, 2, 3};
int m = sizeof (arr)/ sizeof (arr[0]);
int n = 4;
printf ( " %d " , count(arr, m, n));
return 0;
}
|
Output:
4
Time Complexity: O(mn)
Following is a simplified version of method 2. The auxiliary space required here is O(n) only.
C
C
int count( int S[], int m, int n )
{
int table[n+1];
memset (table, 0, sizeof (table));
table[0] = 1;
for ( int i=0; i<m; i++)
for ( int j=S[i]; j<=n; j++)
table[j] += table[j-S[i]];
return table[n];
}
|
Please refer complete article on Dynamic Programming | Set 7 (Coin Change) for more details!
Share your thoughts in the comments
Please Login to comment...