322. 零钱兑换

322. 零钱兑换

  • 原题链接:
  • 完成情况:
    • 一开始错误
    • 原因
  • 解题思路:
  • 参考代码:
    • __322 零钱兑换__错误思路
    • 还得是dp去做

原题链接:

  1. 零钱兑换

完成情况:

一开始错误

322. 零钱兑换_第1张图片

原因

	/*
	解题思路:
		1.先sort一下coins确保硬币面值是从小到大排序的
		2.从最大面额的硬币开始,到最小面额的硬币来结束程序 -> for()
		3.每次面额从1开始,往最多可以选择的能力去++


		这会导致一个很大的问题,那就是原本可以找的开的零钱,会因为你上述的操作,导致根本找不开,因为不存在最低基本单位1
	 */

解题思路:

322. 零钱兑换_第2张图片

参考代码:

__322 零钱兑换__错误思路

package 西湖算法题解___中等题;

import java.util.Arrays;

public class __322  零钱兑换__错误思路 {
	public static void main(String[] args) {
		int coins[] = {186,419,83,408};
		int amount = 6249;
		System.out.println(coinChange(coins,amount));
	}
	public static int coinChange(int[] coins, int amount) {
		/*
		解题思路:
			1.先sort一下coins确保硬币面值是从小到大排序的
			2.从最大面额的硬币开始,到最小面额的硬币来结束程序 -> for()
			3.每次面额从1开始,往最多可以选择的能力去++


			这会导致一个很大的问题,那就是原本可以找的开的零钱,会因为你上述的操作,导致根本找不开,因为不存在最低基本单位1
		 */
		Arrays.sort(coins);
		int useNums = 0;
		//先过滤掉一些没用的
			//如果总金额小于最小的硬币面值
		if (amount==0){
			return 0;
		}
		int coins_length = coins.length -1;
		for (int i=coins_length;i>=0;i--){
			//所有硬币的面值
			for (int j=1;j<=amount/coins[i]+1;j++){
				if (amount - coins[i]*j >0){
					//继续
					useNums++;
				} else if (amount - coins[i]*j ==0) {
					useNums++;
					return useNums;
				}else{
					//说明当前面值换不了了
					amount-=(coins[i]*(j-1));
					break;
				}
			}
		}
		return -1;
	}
}

还得是dp去做

package 西湖算法题解___中等题;

import java.util.Arrays;

public class __322零钱兑换__动态递归 {
	public int coinChange(int[] coins, int amount) {
		int max = amount +1;
		int dp_coins [] = new int[amount + 1];
		Arrays.fill(dp_coins,max);
		dp_coins[0] = 0;
		for (int i=1;i<=amount;i++){
			for (int j=0;i<coins.length;j++){
				if (coins[j] <= i){
					dp_coins[i] = Math.min(dp_coins[i],dp_coins[i - coins[j]] + 1);
				}
			}
		}
		return dp_coins[amount] > amount ? -1 :dp_coins[amount];
	}
}

你可能感兴趣的:(#,LeetCode题解,算法知识,java,开发语言,算法,dp,leetcode)