combination sum(I, II, III, IV)

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];    

 

posted @ 2018-09-25 16:01  demianzhang  阅读(205)  评论(0编辑  收藏  举报