• 322. Coin Change


    You are given coins of different denominations and a total amount of money amount. Write a function to compute 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.

    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
    

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

    Approach #1: DP. [C++]

        int coinChange1(vector<int>& coins, int amount) {
            vector<int> dp(amount+1, amount+1);
            dp[0] = 0;
            
            for (int coin : coins) {
                for (int i = coin; i <= amount; ++i) {
                    dp[i] = min(dp[i], dp[i-coin]+1);
                }
            }
            
            return dp[amount] == amount+1 ? -1 : dp[amount];
        }
    

      

    Approach #2: DFS + Greedy + Pruning. [C++]

    class Solution {
    public:
        int coinChange(vector<int>& coins, int amount) {
            sort(coins.rbegin(), coins.rend());
            int ans = INT_MAX;
            
            coinChange(coins, 0, amount, 0, ans);
            
            return ans == INT_MAX ? -1 : ans;
        }
        
    private:
        void coinChange(const vector<int>& coins, 
                        int idx, int amount, int count, int& ans) {
            const int coin = coins[idx];
            if (idx == coins.size()-1) {
                if (amount % coin == 0) 
                    ans = min(ans, count + amount / coin);
            } else {
                for (int k = amount / coin; k >= 0 && count+k < ans; --k) {
                    coinChange(coins, idx+1, amount-k*coin, count+k, ans);
                }
            }
            
        }
        
    };
    

      

    Analysis:

    http://zxi.mytechroad.com/blog/dynamic-programming/leetcode-322-coin-change/

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    java集合框架复习(一)
    java集合框架复习
    java集合框架
    Mysql视图的作用及其性能分析
    php语法基础
    MySQL UNION 与 UNION ALL 语法与用法
    mysql fetch 系列函数
    跨线程传递数据解决方案 ThreadLocal 和 HystrixRequestVariableDefault
    java中带参数的try(){}语法含义是什么?
    Activiti 设置comment的用户
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389187.html
Copyright © 2020-2023  润新知