leetcode322. 零钱兑换
生活随笔
收集整理的這篇文章主要介紹了
leetcode322. 零钱兑换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:論語
二:題目
三:上碼
class Solution { public:/**思路:1.分析題意這個就是我們從coins數組中找出幾個數字(可以重復)然后的話我們是需要找出這個幾個數字的和為amount;那么這個滿足答案的結果是可以有多個,但是我們的要求是求取最少的硬幣個數2.動態規劃五步走1>:確定dp數組的含義以及下標的含義dp[j] 表示背包容量為j(也就是金額為j)的時候;我們最少為dp[j]個數字2>:確定dp數組的狀態遞推公式dp[j] = min(dp[j],dp[j-coins[i]]+1);//加這個1代表的是我們加上了coins[i]這個數字3>:確定dp數組的初始化因為這里我們是要求最小的值;所以我們是需要在和初始化的時候將其dp初始為最大值但是當j = 0的時候 也就是背包容量為0的時候我們需要賦初值為0;根據題目中最后一個例子我們可以得出; 4>:確定dp數組的遍歷順序因為可以重復加入,所以的話我們是正序5>:舉例驗證coins = [1,2,5];amount = 60 1 2 3 4 5 6coins[0] = 1 0 1 2 3 4 5 6coins[1] = 2 1 1 1 2 3 4 5 coins[2] = 5 1 1 1 2 3 4 2 */int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,INT_MAX);dp[0] = 0;for(int i = 0; i < coins.size(); i++) {//物品for(int j = 0; j <= amount; j++) {//背包容量if(j >= coins[i] && dp[j-coins[i]] != INT_MAX)//如果我們的第一個物品的價值不是1的話,那么我們dp[j] = min(dp[j],dp[j-coins[i]] + 1); //對應的dp[j]就是無窮大的,所以我們是不能取其值的}}return dp[amount] == INT_MAX ? -1 : dp[amount];//這個用3目運算符目的是為了當有不滿足tiao件的時候} // 我們返回-1 };總結
以上是生活随笔為你收集整理的leetcode322. 零钱兑换的全部內容,希望文章能夠幫你解決所遇到的問題。