zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    转载:每一个程序员要遵守的一些优秀编程风格
    Eclipse使用技巧及个性化设计
    博客园颜色、粗细、字体及大小
    转载:开发移动应用的7大设计要点
    转载:15件事造就有理想的程序员
    程序员理想
    找工作主要看什么
    转载:程序员应该扪心自问的10个问题
    程序员保值的4个秘密
    HTML5标签一览
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389187.html
Copyright © 2011-2022 走看看