其他分享
首页 > 其他分享> > LeetCode之找零钱

LeetCode之找零钱

作者:互联网

题目:已知不同面值的钞票,求如 何用最少数量的钞票组成某个金额,求可 以使用的最少钞票数量。如果任意数量的已知面值钞票都无法组成该金额, 则返回-1。

示例:

Input: coins = [1, 2, 5], amount = 11
Output: 3 
Explanation: 11 = 5 + 5 + 1
Input: coins = [2], amount = 3
Output: -1

解题步骤:

1、首先将原问题拆分为子问题

2、确认状态

  DP[0] - DP[amount] 表示构造金额amount需要的最小钞票数

3、确认边界状态(初试条件)

4、状态转移方程

  dp[i] = min(dp[i-1], dp[i-2], dp[i-5]) + 1

代码实现:

 public static int coinChange(int[] coins, int amount) {
        int len = coins.length;
        if (len == 0 || amount < 0) {
            return -1;
        }
        if (amount == 0) {
            return 0;
        }
        int[] dp = new int[amount + 1];

        // 初始化
        for (int i = 0; i <= amount; i++) {
            dp[i] = -1;
        }
        for (int i = 0; i < len; i++) {
            if (coins[i] == amount)
                return 1;
            if (coins[i] < amount)
                dp[coins[i]] = 1;
        }

        // 状态转移方程
        for (int i = 1; i <= amount; i++) {
            for (int j = 0; j < len; j++) {
                if ((i - coins[j] >= 0) && dp[i - coins[j]] != -1) {
                    if (dp[i] == -1 || dp[i] > dp[i - coins[j]] + 1) {
                        dp[i] = dp[i - coins[j]] + 1;
                    }
                }
            }
        }

        // 返回值
        return dp[amount];
    }

 

标签:int,coins,钞票,零钱,amount,DP,LeetCode,dp
来源: https://www.cnblogs.com/jlutiger/p/11950059.html