• LeetCode //C - 322. Coin Change


    322. Coin Change

    You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money.

    Return the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

    You may assume that you have an infinite number of each kind of coin.
     

    Example 1:

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

    Example 2:

    Input: coins = [2], amount = 3
    Output: -1

    Example 3:

    Input: coins = [1], amount = 0
    Output: 0

    Constraints:

    -1 <= coins.length <= 12

    • 1 < = c o i n s [ i ] < = 2 31 − 1 1 <= coins[i] <= 2^{31} - 1 1<=coins[i]<=2311
    • 0 < = a m o u n t < = 1 0 4 0 <= amount <= 10^4 0<=amount<=104

    From: LeetCode
    Link: 322. Coin Change


    Solution:

    Ideas:
    1. Initialize an array dp of size amount + 1 and fill it with amount + 1. This value acts as a placeholder for an unattainable number of coins (since it’s impossible to have more coins than the amount itself).
    2. Set dp[0] = 0 because no coins are needed for the amount 0.
    3. Iterate through each amount from 1 to amount.
    4. For each amount, iterate through the array of coins.
    5. If the coin value is less than or equal to the current amount, update dp[amount] to be the minimum of dp[amount] and dp[amount - coin] + 1.
    6. After filling the table, check dp[amount]. If it’s still amount + 1, it means the amount cannot be formed by the given coins, so return -1. Otherwise, return dp[amount].
    Code:
    int coinChange(int* coins, int coinsSize, int amount) {
        int dp[amount + 1];
        for (int i = 0; i <= amount; i++) {
            dp[i] = amount + 1;
        }
        dp[0] = 0;
    
        for (int i = 1; i <= amount; i++) {
            for (int j = 0; j < coinsSize; j++) {
                if (coins[j] <= i) {
                    dp[i] = dp[i] < dp[i - coins[j]] + 1 ? dp[i] : dp[i - coins[j]] + 1;
                }
            }
        }
    
        return dp[amount] > amount ? -1 : dp[amount];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    敢于尝新 却沦为试错的小白鼠?
    运动健康服务场景事件订阅,让应用推送“更懂用户”
    一、 计算机网络概论
    Swoole协程
    电机调试说明SimpleFOC和ODrive
    Cloneable接口与浅克隆,深克隆
    Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总
    华为云 MRS 基于 Apache Hudi 极致查询优化的探索实践
    简单 php结合WebUploader实现文件上传功能
    机器学习(七):sklearn转换器估计器及K-近邻算法
  • 原文地址:https://blog.csdn.net/navicheung/article/details/134634322