题干:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。具体解析过程见代码
package likou;
/*
* 322.零钱兑换
* 题干:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额
* 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
* 如果整数为0,返回0
*/
public class Demo322 {
/*
* 解题思路:利用动态规划算法求解
* 1.假设amount可以由给出的不同硬币组成,假设由n个硬币组成,那最后一个硬币肯定是coins数组中的一个
* 2.对金额从1到amout开始遍历,计算每一个金额所需要的硬币的数量即i从1开始
* 2.对数组进行遍历,则只需要计算前n-1个币值所用的数量最少即可(代码第21到31行),如果能够组成对应数值,则将tempValue值维护上
* 3.最后返回值即可
*/
public int coinChange(int[] coins, int amount) {
int length = coins.length;
int[] tempArray = new int[amount+1];
int tempValue = 0;
for(int i=1;i<=amount;i++) {
tempValue = Integer.MAX_VALUE;
for(int j=0;j<length;j++) {
int temp = i - coins[j];
if(temp == 0 ) {
tempValue = 0;
break;
}else if(temp >0 && tempArray[temp] > 0){
tempValue = Math.min(tempValue, tempArray[temp]);
}else {
continue;
}
}
if(tempValue<Integer.MAX_VALUE) {
tempArray[i] = tempValue;
}
}
if(amount == 0) {
return 0;
}
if(tempArray[amount] == 0) {
return -1;
}
return tempArray[amount];
}
public static void main(String args[]) {
Demo322 demo = new Demo322();
int[] coins = {2,5,10,1};
int amount = 27;
System.out.println(demo.coinChange(coins, amount));
}
}