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)
  • 相关阅读:
    关于PPTP不能打开部分网页
    在MarS Board上搭建PPTP
    Mars Board上无法使用apt-get
    在MarS board上烧录系统镜像
    PHP-变量(1)
    在KEIL 4.72中使用STM32的3.5固件库
    android SDK中java环境变量配置
    android SDK中打开AVD时提示PANIC: Could not open:XX
    ckplayer通过Mod-H264支持随意拖动功能
    430学习笔记-内置ADC12
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389187.html
Copyright © 2011-2022 走看看