leetcode 322. Coin Change 解题报告

原题链接

原题链接

解题思路

题目很熟悉,和以前做过的一道很类似,于是想都没想就知道肯定是动态规划。
建立一个dp数组。dp[i]表示当凑齐i时最少要多少个数字组成。状态转移方程dp[i] = Math.min(dp[i-k] + 1,dp[i]);
解释一下吧,dp[i-k]只要不等于Integer.MAX_VALUE,证明凑齐i-k,有解。并且前面已经算出来了,这时候再加上k的1位数字就行。为了保证最少,所以要在诸多解中取最小值。

解题代码

public class Solution {
    public int coinChange(int[] coins, int amount) {
        if (amount == 0) return 0;
        int[] dp = new int[amount + 1];
        dp[0] = 0;
        for (int i = 1;i <= amount ;i++ ) {
            dp[i] = Integer.MAX_VALUE;
            for(int k :coins) {
                if(i>=k && dp[i-k] != Integer.MAX_VALUE) {
                    dp[i] = Math.min(dp[i-k] + 1,dp[i]);
                }
            }
        }
        if(dp[amount] 0) {
            return dp[amount];
        } else {
            return -1;
        }

    }
}

你可能感兴趣的:(leetcode)