力扣322-零钱兑换

        题干:给你一个整数数组 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));
	 }
	 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值