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)
  • 相关阅读:
    O021、创建 Image
    O020、理解 Glance
    O019、通过例子学习 Keystone
    O018、理解 Keystone 核心概念
    O017、部署DevStack
    O016、搭建实验环境
    O015、OpenStack 架构
    O014、云计算与OpenStack
    O013、动手实践Linux VLAN
    O012、Linux如何实现VLAN
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389187.html
Copyright © 2011-2022 走看看