Given change C and $S=\{S_{1}, S_{2}, ... ,S_{k} \}$, find the mininum numbers of coins that adds up to C
let the numbers of coins to be $\varphi$
Example 1. Given change C = 6 and $S=\{2, 3, 4\}$, find the mininum number of coins adds up to 6
C = 6 = 2 + 2 + 2 $\Rightarrow \varphi =3$
C = 6 = 2 + 4 $\Rightarrow \varphi =2$
C = 6 = 4 + 2 $\Rightarrow \varphi =2$
C = 6 = 3 + 3 $\Rightarrow \varphi =2$
$\Rightarrow \varphi=2$
Mathematic Concept
Given C and find the linear combination of $S=\{S_{1}, S_{2}, ... ,S_{k} \} \Rightarrow C = \sum_{i=1}^{k} x_{i}S_{i}$
$C = 6\quad S=\{2, 3, 4\}$
$6 = 1*2 + 1*2 + 1*2 \Rightarrow x_{1}=1\quad x_{2}=1\quad x_{3}=1 \Rightarrow \varphi = 1 + 1 + 1 = 3 \textbf{ coins}$
$6 = 1*2 + 1*4 \Rightarrow x_{1}=1\quad x_{2}=1 \Rightarrow \varphi = 1 + 1 = 2 \textbf{ coins}$
$6 = 1*4 + 1*2 \Rightarrow x_{1}=1\quad x_{2}=1 \Rightarrow \varphi = 1 + 1 = 2 \textbf{ coins}$
$6 = 1*3 + 1*3 \Rightarrow x_{1}=1\quad x_{2}=1 \Rightarrow \varphi = 1 + 1 = 2 \textbf{ coins}$
Example 2. Given change C = 0 and $S=\{2, 3, 4\}$, find the mininum number of coins adds up to 0
Since C = 0, zero coin adds up to C = 0. Therefore, the solution is zero coin
C = 0 = 0 $\Rightarrow \varphi =0$
Mathematic Concept
$C = 0 = 0*2 + 0*3 + 0*4 \Rightarrow x_{1}=0\quad x_{2}=0\quad x_{3}=0 \Rightarrow \varphi = 0 + 0 + 0 = 0 \textbf{ coin}$
Example 3. Given change C = -2 and $S=\{2, 3, 4\}$(has no coin), find the mininum number of coins adds up to 6
There is no solution, since C is negative [ $\because$ we can't have negative number of coins ]
If C < 0, then we can let $\varphi =\infty$
Ok, you might ask why is $\varphi =\infty$, why not is $\varphi =0$
Well, $\varphi =0$ is the solution for C = 0. But I still don't understand why $\varphi$ has to be $\infty$
Real reason behind that why $\varphi$ has to be $\infty$
$\infty$ acts as identity for min( , ) operation
E.g. $0$ is the identity for + since $0 + a = a, a \in \mathbb{N}$
E.g. $1$ is the identity for * since $1*a = a, a\in \mathbb{N}$
Similarly, $\infty$ is the identity for $min( , )$ since $min(\infty, a) = a, a \in \mathbb{N}$
min(,) is called monoid with Math.MAX_VALUE as identity
Ok, make sence, but why do we need the $\infty$ as identity for the [ coin change problem ]
Let's look at the following graph for $\text{coin } = \{2, 3, 4\}, S = 6$
The value of each node $=$ the value of parent node $-$ weight of the edge [ except the root node ]
Some leaf nodes are $\infty$ since the value of parent node $<$ the weight of edge
Why we set the value of the node = $\infty$ ? since we know the path contains $\infty$ can't be a solution
The only path might be a solution is the value of leaf node has to be zero [ which is the red node ]
Since we are looking for the minimum number of coins, then the solution(s) has/have to be the shortest path from the root
// /Users/cat/myfile/bitbucket/java/CoinChange.java
//CoinChange.java
//Given coin{2, 3, 4} and s = 6
//Find the minimum number of coins sums up to s
public static int minCount(int[] coin, int s, int k) {
int min = Integer.MAX_VALUE;
if(s == 0)
min = 0;
else if(s > 0) {
// min(s) = min(s-coin[k]) + 1
for(int i=0; i < k; i++) {
int childMin = minCount(coin, s-coin[i], k);
if(childMin != Integer.MAX_VALUE)
min = Math.min(min, childMin + 1);
}
}
return min;
}
Coin Change, 2018 version in Java
/*
(4) -> (4 - 2) -> (2 - 2)
{2} s = 4
[ s=4
[ s=2
[ s = 0
0 <-]
1 <-]
2 <-]
*/
public static int minCoins(List list, int s){
int min = Integer.MAX_VALUE;
if( list != null){
if (s < 0){
return Integer.MAX_VALUE;
}
else if( s == 0){
return 0;
}else{
for(Integer n : list){
min = Math.min(min, minCoins(list, s - n));
}
}
}
return min + 1;
}