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.

Note: You may assume that you have an infinite number of each kind of coin.


解題報告

這道題目的意思是從給出的數(shù)中找到若干個,使他們的和為一個定值。求所需的數(shù)的最小個數(shù),如果不存在則輸出-1

這道題是典型的完全背包問題。

設想一下,對于值為x的數(shù),如果amount-x可以被計算得到,那么也可以被計算得到。于是得到遞推式:

dp[j] = min(dp[j], dp[j-coins[i]+1) //dp中存放的為計算得到j需要的最少的數(shù)字

初始條件

dp[0] = 0, dp[1..amount] = MAX;


代碼

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,amount+1);
        
        dp[0] = 0;
        for (int i=0;i<coins.size();i++){
            for (int j=coins[i];j<=amount;j++){
                dp[j] = min(dp[j],dp[j-coins[i]]+1);
            }
        }
        
        return dp[amount] > amount ? -1 : dp[amount];
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容