public class CoinChangeTest {
public int coinChange(int[] coins, int amount) {
if(0 == amount){
return 0;
}
int size = coins.length;
int[] r = new int[amount + 1];
int[] nu = new int[amount + 1];
for (int i = 0; i <= amount; i++) {
r[i] = -1;
nu[i] = -1;
}
minCoin(amount, size, coins, r, nu);
int result = nu[amount];
if(nu[amount] == Integer.MAX_VALUE){
return -1;
}else {
int[] digital = new int[result];
int tmp = r[amount];
int tmpNum = amount;
int num = 0;
while (tmp > 0){
digital[num++] = tmp;
System.out.println("r[tmp]:" + r[tmp] + ",tmp:" + tmp);
tmpNum = tmpNum - tmp;
tmp = r[tmpNum];
}
for(int i = 0; i < result; i++){
System.out.println(digital[i]);
}
return nu[amount];
}
}
public int minCoin(int sum, int n, int[] p, int[] r, int[] nu) {
if (nu[sum] >= 0) {
return nu[sum];
}
int minCount = Integer.MAX_VALUE - 1;
for (int i = 0; i < n; i++) {
if (p[i] == sum) {
r[sum] = p[i];
minCount = 0;
} else if (sum > p[i]) {
int lastCount = minCoin((sum - p[i]), n, p, r, nu);
if (lastCount <= minCount) {
minCount = lastCount;
r[sum] = p[i];
}
}
}
nu[sum] = minCount + 1;
return minCount + 1;
}
}