哪個網(wǎng)站是做旅游B2B的關鍵詞優(yōu)化排名軟件怎么樣
?
目錄
474.?一和零
518.?零錢兌換 II?
377.?組合總和 Ⅳ?
?322.?零錢兌換
?總結:
474.?一和零
?
這道題和前面的思路一樣,就是需要將背包擴展到二維。
class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(auto s:strs){int oneNum=0,zeroNum=0;for(auto c:s){if(c=='0') zeroNum++;else if(c=='1') oneNum++;}for(int i=m;i>=zeroNum;i--){for(int j=n;j>=oneNum;j--){dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);}}}return dp[m][n];}
};
518.?零錢兌換 II?
?
每個硬幣可以無限制取,完全背包問題。先確定dp[i]表示的含義,i表示背包容量,dp[j]表示該容量有多少種方法。再確定遞推公式,dp[j]+=dp[j-coins[i]];。最后確定遍歷順序,因為每個硬幣都可以無限制取,所以j的遍歷順序應該為正序。
注意:在01背包中為了防止元素重復取,采用倒序
class Solution {
public:int change(int amount, vector<int>& coins) {vector<int> dp(amount+1,0);dp[0]=1;for(int i=0;i<coins.size();i++){for(int j=coins[i];j<=amount;j++){dp[j]+=dp[j-coins[i]];}}return dp[amount];}
};
377.?組合總和 Ⅳ?
?
?這題和上題的區(qū)別在于這題是排列,上題是組合。組合問題先遍歷物品后遍歷背包容積,排列問題先遍歷背包容積后遍歷物品。進入循環(huán)里面思考一下就明白了怎么回事了。
class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target+1,0);dp[0]=1;//遍歷背包容積for(int j=0;j<=target;j++){//遍歷物品for(int i=0;i<nums.size();i++){if(j<nums[i] || dp[j]>INT_MAX-dp[j-nums[i]]) continue;dp[j]+=dp[j-nums[i]];}}return dp[target];}
};
?322.?零錢兌換
?
這題的不同之處在于求最小硬幣個數(shù),初始化的時候注意初始化為最大值。
class Solution {
public: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=coins[i];j<=amount;j++){//如果dp[j-coins[i]]==INT_MAX,將超出int的范圍if(dp[j-coins[i]]!=INT_MAX)dp[j]=min(dp[j],dp[j-coins[i]]+1);}}if(dp[amount]==INT_MAX) return -1;return dp[amount];}
};
?總結:
01背包問題和完全背包問題的主要區(qū)別是元素是否可以無限制取。
在解決問題的方式上,如果是求組合就先遍歷物品再遍歷背包容積,如果是求排列就先遍歷背包容積再遍歷物品。