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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

零钱兑换I

發布時間:2024/4/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 零钱兑换I 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路

題目中說每種硬幣的數量是無限的,可以看出是典型的完全背包問題。

確定dp數組以及下標的含義

dp[ j ]:湊足總額為 j 所需錢幣的最少個數為 dp[ j ]

確定遞推公式

得到dp[j](考慮coins[i]),只有一個來源,dp[j - coins[i]](沒有考慮coins[i])。

湊足總額為j - coins[i]的最少個數為dp[j - coins[i]],那么只需要加上一個錢幣coins[i]即dp[j - coins[i]] + 1就是dp[j](考慮coins[i])

所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。

遞推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

dp數組如何初始化

首先湊足總金額為0所需錢幣的個數一定是0,那么dp[0] = 0;

其他下標對應的數值呢?

考慮到遞推公式的特性,dp[j]必須初始化為一個最大的數,否則就會在min(dp[j - coins[i]] + 1, dp[j])比較的過程中被初始值覆蓋。

所以下標非0的元素都是應該是最大值。

代碼如下:

vector<int> dp(amount + 1, INT_MAX); dp[0] = 0;

確定遍歷順序

本題求錢幣最小個數,那么錢幣有順序和沒有順序都可以,都不影響錢幣的最小個數。

所以本題并不強調集合是組合還是排列。

如果求組合數就是外層for循環遍歷物品,內層for遍歷背包。

如果求排列數就是外層for遍歷背包,內層for循環遍歷物品。

在動態規劃專題中求組合數是:518.零錢兌換II,求排列數是:377. 組合總和 Ⅳ。

所以本題的兩個for循環的關系是:外層for循環遍歷物品,內層for遍歷背包或者外層for遍歷背包,內層for循環遍歷物品都是可以的!

那么我采用coins放在外循環,target在內循環的方式。

本題錢幣數量可以無限使用,那么是完全背包。所以遍歷的內循環是正序

綜上所述,遍歷順序為:coins(物品)放在外循環,target(背包)在內循環。且內循環正序。

舉例推導dp數組

以輸入:coins = [1, 2, 5], amount = 5為例

class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,INT_MAX);dp[0]=0;for(int ii=0;ii<coins.size();ii++){// 遍歷物品for(int jj=coins[ii];jj<=amount;jj++){// 遍歷背包if(dp[jj-coins[ii]]!=INT_MAX) dp[jj]=min(dp[jj],dp[jj-coins[ii]]+1);// 如果dp[j - coins[i]]是初始值則跳過}}if(dp[amount]==INT_MAX) return -1;return dp[amount];} };

對于遍歷方式遍歷背包放在外循環,遍歷物品放在內循環也是可以的

class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,INT_MAX);dp[0]=0;for(int jj=0;jj<=amount;jj++){for(int ii=0;ii<coins.size();ii++){if(jj>=coins[ii]&&dp[jj-coins[ii]]!=INT_MAX) dp[jj]=min(dp[jj],dp[jj-coins[ii]]+1);}}if(dp[amount]==INT_MAX) return -1;return dp[amount];} };

總結

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

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