【leetcode hot 100 322】零钱兑换

解法一:(动态规划)①定义:dp[i]表示能组合成i的最少硬币个数,dp[n+1] ②初始状态:dp[0]=0 dp[i]=Integer.MAX_VALUE ③状态转移方程:dp[i] = Math.min(min, dp[i - j*j])+1,因为每次循环都i++,之前的最小完全平方数加起来肯定不能到i,所以min必须+1

import java.util.*;

/**
 * @author longyy
 * @version 1.0
 */
class Solution79 {
public int coinChange(int[] coins, int amount) {
        // 定义:dp[i]表示能组合成i的最少硬币个数,dp[n+1]
        // 初始状态:dp[0]=0 dp[i]=Integer.MAX_VALUE
        // 状态转移方程:dp[i] = Math.min(min, dp[i - j*j])+1,因为每次循环都i++,之前的最小完全平方数加起来肯定不能到i,所以min必须+1
        int[] dp = new int[amount + 1]; // dp[i]表示得到和为i的最少硬币个数
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int i = 1; i <= amount; i++) {
        	// 不是每次加一个,每次找和为i的最小数
            int min = Integer.MAX_VALUE;
            for (int j = 0; j < coins.length; j++) {
                if (coins[j] <= i && dp[i - coins[j]]!=Integer.MAX_VALUE) {
                    // 找到了
                    min = Math.min(min,dp[i - coins[j]]+1);
                }
                // if (coins[j] <= i) {
                //     min = Math.min(min, dp[i - coins[j]]==Integer.MAX_VALUE?Integer.MAX_VALUE:dp[i - coins[j]]+1);
                // }
                dp[i] = Math.min(dp[i], min);
            }
        }
        if(dp[amount] == Integer.MAX_VALUE){
            return -1;
        }
        return dp[amount];
    }
   

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine().trim();
        int amount = in.nextInt();
        String[] split = s.split(",");
        int[] coins = new int[split.length];
        for (int i = 0; i < split.length; i++) {
            coins[i] = Integer.parseInt(split[i]);
        }
        Solution79 sol = new Solution79();
        System.out.println(sol.coinChange(coins, amount));
    }
}

注意:

  • 为了方便后续判断,Arrays.fill(dp, Integer.MAX_VALUE);
  • Math.min(min, dp[i - coins[j]]==Integer.MAX_VALUE?Integer.MAX_VALUE:dp[i - coins[j]]+1) 取到这个数之前,要判断这个数是否为Integer.MAX_VALUE,如果是的话,这个数不可取。
  • 每一个数都一定有【完全平方数】,但每一个数不一定有零钱和与之相等,需要初始化Arrays.fill(dp, Integer.MAX_VALUE);和判断dp[i - coins[j]]!=Integer.MAX_VALUE
  • 初始化dp数组大小时,一般计算总数时是n+1,以**结尾为n+1;其余为n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值