leetcode377. 组合总和 Ⅳ
生活随笔
收集整理的這篇文章主要介紹了
leetcode377. 组合总和 Ⅳ
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
二:上碼
1:動態規劃
class Solution { public:/**思路:1.首先確定完全背包 因為我們可以重復加入2.動態規劃5步走1>:確定dp數組以及下標的含義dp[i] 表示的是背包容量為i的時候(這里的 i 也是就是我們的target),有多少種排列數目2>:確定dp數組的遞推公式這個是統計有多少種 排列的個數,所以我們是需要用到前面求出來的結果比如 i = 5 的時候,這時放入背包的是 2 那么我們是需要dp[3]的排列結果的3>:確定dp數組的初始化dp[0] = 1;4>:確定dp數組的遍歷順序如果求組合數就是外層for循環遍歷物品,內層for遍歷背包。如果求排列數就是外層for遍歷背包,內層for循環遍歷物品。5>:*/int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target+1,0);dp[0] = 1;for(int i = 0; i <= target; i++) {//遍歷背包for(int j = 0; j < nums.size(); j++) {//遍歷物品if(i >= nums[j] && dp[i] < INT_MAX - dp[i - nums[j]])//這里需要判斷的是防止兩個數的和超過最大值dp[i] += dp[i-nums[j]]; //即dp[i] + dp[i-nums[i]] < INT_MAX} }return dp[target];} };2:回溯暴搜(超時)
記錄失敗碼
class Solution { public:/**思路:1.確定好回溯函數的返回值和參數2.確定好回溯函數的遞歸終止條件3.確定遍歷順序*/vector<vector<int> > ans;vector<int> path;void backstacking(vector<int>& nums,int target,int sum) {// int sum = accumulate(path.begin(),path.end(),0);if(sum >= target) {if(sum == target) ans.push_back(path);return;}for(int i = 0; i < nums.size(); i++) {path.push_back(nums[i]);sum+=nums[i];backstacking(nums,target,sum);path.pop_back();sum-=nums[i];}}int combinationSum4(vector<int>& nums, int target) {backstacking(nums,target,0);return ans.size();} };總結
以上是生活随笔為你收集整理的leetcode377. 组合总和 Ⅳ的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白薯叶的功效与作用、禁忌和食用方法
- 下一篇: leetcode322. 零钱兑换