【LeetCode 】: 322. 零钱兑换

322. 零钱兑换

问题描述:

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

题目链接:https://leetcode-cn.com/problems/coin-change/

示例1

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1

思路:

动态规划方法,采用自底向上思想,在计算 F(i) 之前,我们先计算出 F(0)-F(i-1) 的答案。写出状态回归方程:F(n) = min(F(i) , F(i-coins[j]) + 1)
例如:当输入硬币为1, 2, 5,需要金额为11
F(0) = 0
F(1) = min(F(1-1) , F(1-2) , F(1-3)) + 1 = 1
F(2) = min(F(2-1) , F(2-2) , F(2-5)) + 1 = 1
F(3) = min(F(3-1) , F(3-2) , F(3-5) + 1 = min(F(2),F(1)) + 1 = 2

F(i) = min(F(i-1), F(i-2), F(i-3))

完整代码:

    public int coinChange(int[] coins, int amount) {
        int max = amount + 1;
        int dp[] = new int[amount + 1];
        Arrays.fill(dp , max);
        dp[0] = 0;
        for (int i = 1;i <= amount;i++) {
            for (int j = 0;j < coins.length; j++) {
                if (coins[j] <= i)
                    dp[i] = Math.min(dp[i] , dp[i - coins[j]] + 1);
            }
        }
        return dp[amount] > amount ? -1 : dp[amount];
    }

附加GitHub链接

发布了16 篇原创文章 · 获赞 22 · 访问量 3785

猜你喜欢

转载自blog.csdn.net/qq_36008321/article/details/104581112
今日推荐