日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

动态规划解题(leetcode322零钱兑换)

發布時間:2023/12/13 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 动态规划解题(leetcode322零钱兑换) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態規劃問題的一般形式就是求最值。最顯著的特點是最優子結構和重疊子問題。最優子結構就是子問題的最優解,可以從子問題的最優結果推出更大規模問題的最優結果,可以用狀態轉移方程描述問題。重疊子問題可以通過創建備忘錄dp[]避免重復計算。
零錢兌換的解題步驟:
1)先確定狀態,也就是原問題和子問題中變化的變量,由于硬幣數量可以無限,所以唯一確定的狀態就是目標金額amount。
2)然后確定dp函數的定義,當前的目標金額是n,至少需要dp(n)個硬幣湊出該金額。
3)確定選擇并擇優,無論當前的目標金額是多少,選擇就是從面額列表coins中選則一個硬幣,然后目標金額就會減少。
4)最后明確遞歸的終止條件,顯然目標金額為0時,所需硬幣數量為0,而當目標金額小于0時,無解。在動態規劃中體現為子問題無解,跳過該次內層循環。
湊零錢問題的狀態轉移方程如下:

[dp(n)=egin{cases}
0 & n=0 \
-1 & n<0 \
min{dp[n-coin]+1 | coinin coins} & n>0
end{cases}]

int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1, amount+1);
        dp[0] = 0;
        for(int i = 0; i < dp.size(); i++)
        {
            for(int coin : coins)
            {
                if(i-coin < 0)
                    continue;
                dp[i] = min(dp[i], 1+dp[i-coin]);//索引為i-coin的dp[i-coin]加上for循環在這次選出的這個coin(即加1)

            }
        }
        return dp[amount] == amount+1 ? -1 : dp[amount];//為什么要這樣返回??當給的coins不能湊出amount時就會出錯,比如coins=[2],amount=3,amount無法湊出,此時應返回-1
    }

總結

以上是生活随笔為你收集整理的动态规划解题(leetcode322零钱兑换)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。