II 简单dfs
1 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { 2 3 vector<vector<int>> ans; 4 vector<int> cur; 5 sort(candidates.begin(), candidates.end()); // 排序后去重 6 dfs(0,target,candidates,cur,ans); 7 return ans; 8 } 9 void dfs(int level, int target, vector<int>& candidates,vector<int>& cur,vector<vector<int>> &ans) 10 { 11 if(target==0) 12 { 13 ans.push_back(cur); 14 return; 15 } 16 if(target<0)return; 17 for(int i=level;i<candidates.size();i++) 18 { 19 if (i > level && candidates[i] == candidates[i - 1])continue;// 去重 20 cur.push_back(candidates[i]); 21 dfs(i+1,target-candidates[i],candidates,cur,ans); 22 cur.pop_back(); 23 } 24 25 }
III 简单dfs递归,限制条件是k个数其和为n
1 vector<vector<int>> combinationSum3(int k, int n) { 2 vector<vector<int>> ans; 3 vector<int> cur; 4 dfs(k,n,1,cur,ans); 5 return ans; 6 } 7 void dfs(int k,int n, int level, vector<int> &cur, vector<vector<int>> &ans) 8 { 9 if(k==0&&n==0) 10 { 11 ans.push_back(cur); 12 return; 13 } 14 if(k==0)return; 15 for(int i=level;i<=9;i++) 16 { 17 cur.push_back(i); 18 dfs(k-1,n-i,i+1,cur,ans); 19 cur.pop_back(); 20 } 21 }
IV 简单dp,dfs超时,记忆化dfs应该可以
1 dp[0]=1; 2 for(int i=1;i<=target;i++) 3 { 4 for(int j=0;j<nums.size();j++) 5 { 6 if(nums[j]<=i)dp[i]+=dp[i-nums[j]]; 7 } 8 } 9 return dp[target];