Leetcode 322. 零钱兑换

class Solution {
public:    
    /*
    int search(int idx, int amount, vector<int>& coins, vector<vector<int>> &fn)
    {
        if(idx>=coins.size())
            return 1000000;
        
        if(amount< 0)
            return 1000000;
        
        if(amount  == 0)
            return 0;
        
        if(fn[idx][amount] > 0 )
            return fn[idx][amount];
    
        int a = search(idx, amount-coins[idx], coins, fn) + 1;
        int b = search(idx+1, amount, coins, fn);
        
        fn[idx][amount] = min(a,b);
        
        return fn[idx][amount];
    }
    
    int coinChange(vector<int>& coins, int amount) {
        int m = coins.size();
        int n = amount;
        if(m <= 0 || n <=0)
            return 0;
        vector<vector<int>>  fn(m, vector<int>(n+1, -1));
        int ret = search(0, amount, coins, fn);
        
        if(ret >= 1000000)
            return -1;
        else
            return ret;
    }
    */
    
    int coinChange(vector<int>& coins, int amount) {
        
        vector<int> dp(amount+1, -1);
        dp[0]=0;
        for(int i=1; i<=amount; ++i)
        {
            //对于每一张纸币
            for(int j=0; j<coins.size(); ++j)
            {
                //如果当前值大于当前货币的值,需要的之前已经计算过了
                if( i - coins[j] >= 0 && dp[i - coins[j]] != -1)
                {
                    if(dp[i] == -1 || dp[i] > dp[i-coins[j]] + 1)
                        dp[i] = dp[i-coins[j]] + 1;
                }
            }
        }
        return dp[amount];
    }    
};

猜你喜欢

转载自www.cnblogs.com/randyniu/p/9358148.html
今日推荐