LeetCode 322
https://leetcode-cn.com/problems/coin-change/
这个题很明显的dp问题,因为当前规模的解基于子问题的解。
我一开始想的贪婪算法,发现不对,因为每次都兑换最大币值的硬币的情况下可能会出现不能将钱全部换完的情况。
后来我自己想dp算法,就是从1块钱开始分配,每次都减去coins这个数组中的币值,如果i-coins[j]大于等于0,就是说能兑换这个钱,然后将当前兑换个数和dp[i-coins[j]]+1的值对比,取较小的值。
但是自己第一次写的时候可能出了点差错,导致这个想法做到最后出了问题。。因为我自己是将dp数组中下标是1~amount的值初始化为Integer.MAX_VALUE,导致一加就爆了int的取值变成Integer.MIN_VALUE了,然后我最后返回值的判断是通过dp[amount]==Integer.MAX_VALUE这个来看是否有解。如果爆了int的取值范围导致这个判断会失效。。。
最后优化的代码
class Solution { public int coinChange(int[] coins, int amount) { int[] dp = new int[amount+1]; for(int i = 1; i < amount+1; i++){ dp[i] = amount+1; } dp[0]=0; for(int i = 1; i < amount+1; i++){ for(int j = 0; j < coins.length; j++){ if(i-coins[j] >= 0){ dp[i] = Math.min(dp[i],dp[i-coins[j]]+1); } } } return dp[amount]>amount?-1:dp[amount]; } }