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)
  • 相关阅读:
    linux 文件搜索
    解决android 无法打开 DDMS 中的data目录
    JAVA 截图+tess4j识别
    JAVA 获取网页源代码保存到本地文件
    java连接sqlserver数据简单操作
    SQL server 2008 安装提示:属性不匹配
    SQLServer 安装提示需要重启计算机的解决方案
    Android蓝牙----打开,关闭操作
    JAVA中String类的比较
    Android中的AlertDialog和ProgressDialog用法
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389187.html
Copyright © 2011-2022 走看看