Contents
Problem Statement
Write a C program to solve ‘Change Making Problem’. Put simply, a solution to Change-Making problem aims to represent a value in fewest coins under a given coin system. This program was requested by one of readers on our Facebook Page.
Inputs to program
- Number of different denominations available
- List of numbers representing all the denominations
- Amount to represent in the given coin system
Output
The program should output a way to represent the given amount using fewest number of coins. For example. if you have coins of value 1, 2, 5 and 10 and want to represent 26, the program should output the correct solution 10×2 5×1 2×0 1×1
Solution
The greedy approach is easy to understand and implement as well. We start with using the largest denomination coin/currency possible. Once the owed amount is less than the largest, we move to next largest coin, so on and so forth.
Assumptions
- Denominations are entered in descending order. That is largest one first. Example: 100, 50, 20, 5, 1. We can add a sort method if it’s not, a minor change.
- We always have denomination of 1(Just to make sure we have a solution for all the numbers).
Limitation
Greedy approach works best with Canonical Coin systems and may not produce optimal results in arbitrary coin systems. For example, if denominations are {4, 3, 1}, number 6 is represented as 4×1 3×0 1×2 by this program; taking 3 coins. The correct answer in this case is 4×0 3×2 1×0 with just 2 coins.
The Program
#include <stdio.h> | |
int main () { | |
int num_denominations, coin_list[100], use_these[100], i, owed; | |
printf("Enter number of denominations : "); | |
scanf("%d", &num_denominations); | |
printf("\nEnter the denominations in descending order: "); | |
for(i=0; i< num_denominations; i++) { | |
scanf("%d", &coin_list[i]); | |
// use_these[i] = 0; | |
} | |
printf("\nEnter the amount owed : "); | |
scanf("%d", &owed); | |
for(i=0; i < num_denominations; i++) { | |
use_these[i] = owed / coin_list[i]; | |
owed %= coin_list[i]; | |
} | |
printf("\nSolution: \n"); | |
for(i=0; i < num_denominations; i++) { | |
printf("%dx%d ", coin_list[i], use_these[i]); | |
} | |
} |
Sample Output
Further reading
- Change-making problem
- Greedy Introduction
- When can a greedy algorithm solve the coin change problem?
- Canonical Coin Systems for Change-Making Problems[PDF]