1. 程式人生 > >LeetCode 322. Coin Change

LeetCode 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:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

分析:動態規劃。dp[i]表示錢數為i時找零的最小的個數。
dp[i]=min{dp[i],dp[icoins[j]]+1},0k<n
邊界條件:
1)amount=0
2)coins為空
程式碼如下:

class Solution {
public:
    int coinChange(vector<int> &coins,int amount)
    {
        if(amount==0) return 0;
        if(coins.size()==0
) return -1; const int maxn = amount+1; int n = coins.size(); int dp[amount+1]; dp[0]= 0; for(int i = 1; i <= amount; i++) dp[i] = maxn; for(int i = 1; i <= amount; i++) { for(int j = 0; j < n; j++) { if
(i >= coins[j] && dp[i-coins[j]] != maxn) { dp[i] = min(dp[i], dp[i-coins[j]] + 1); } } } return dp[amount] == maxn ? -1 : dp[amount]; } };

程式碼2:大致思路一樣,實現不一樣

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int result=count(amount,coins);
        return result==INT_MAX? -1 : result;
    }
    int count(int n,vector<int> &coins) {
        if(n==0) return 0;
        if(coins.size()==0) return -1;

        int dp[n+1]={0};
        for(int i=1;i<=n;i++) {
            int minVal=INT_MAX;
            for(int j=0;j<coins.size();j++) {
                if(i>=coins[j] && dp[i-coins[j]]!=-1) {
                    minVal=min(minVal,dp[i-coins[j]]+1);
                }
            }
            dp[i]=minVal==INT_MAX?-1:minVal;
        }

        return dp[n];
    }
};