Leetcode題解系列——322. Coin Change(c++版)
阿新 • • 發佈:2018-12-16
題目連結:322. Coin Change
題目大意:給出硬幣的面值以及所需要的總金額,試圖找到最少個數的找錢方式,這裡假設硬幣的個數都是無限個。
注意點:
1.可能存在無法找零的情況,注意判斷。
2.注意動態規劃陣列的下標是從1開始還是從0開始
一.演算法設計
這道也是典型的動態規劃題目,不能使用貪心演算法來解決。
設定陣列dp[i],表達找零總額為i的最少硬幣總數。
注意初始化給每一個金額先賦值為MAX值,方便後面判斷是否沒有找零的情況。
狀態轉移方程:dp[i] = min(dp[i], dp[i-coins[j]]+1);
表達為遍歷所擁有的硬幣,查詢需要該硬幣的前一個dp值+1後是否小於當前dp值,如果是則更換dp值。始終保持dp為當前金額的最小硬幣數
判斷是否無法找零,是通過對於最後的dp值,如果仍等於MAX值,則證明沒有辦法找到一個方案找零,返回-1.
二.演算法實現
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1);
int csize = coins.size();
for(int i = 1; i <= amount; i++) dp[i] = 10000;
for(int i = 1; i <= amount; i++){
for(int j = 0; j < csize; j++){
if(i >= coins[j])
dp[i] = min(dp[i], dp[i-coins[j]]+1);
}
}
if(dp[amount] == 10000) return -1;
else return dp[amount];
}
};