[LeetCode] Combination Sum
2014-07-13 17:04
525 查看
void func(const vector<int> & candidates, int target, vector<int> & path, int cur , int sum , vector<vector<int> > & ret ) { if( sum == target ) { ret.push_back(path); // path.pop_back(); // return; } else if( cur >= candidates.size() ) { // if(!path.empty()) path.pop_back(); return; } for(int i = 0; sum + i * candidates[cur] <= target ; i++) { for(int j = 0 ;j < i;j++) path.push_back(candidates[cur]); func( candidates, target, path, cur+1, sum + i*candidates[cur] , ret); for(int j = 0 ; j< i;j++) path.pop_back(); } } vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<vector<int> > ret ; vector<int> path; sort(candidates.begin() , candidates.end()); func( candidates, target, path, 0, 0 , ret); return ret; }
全部背包问题。由于要生成并保存所有可行解,必须使用DFS递归。
代码技巧:函数参数使用引用。(如何保证互不影响??)
扩展问题:如果要求可行解的个数呢?下面给出递归和递推两种方法。
代码技巧:递归的难点在递归的层级和边界,这两个递归的边界处理,各有技巧。
int count(const vector<int> & vec ,int key) { int i,j,k; for(i = 1 ; i < M ; i++) { B[i][0] = 1 ; } for(j=1; j<=N; j++){ B[M-1][j] = ( j % vec[M-1] ? 0 : 1); } for ( i = M-2 ; i >= 0 ; i--) for( j = 1; j<= key ;j++) { for( k = 0; k <= j; k += vec[i]) B[i][j] += B[i+1][j-k]; } return B[0][key]; }
View Code
相关文章推荐
- [Leetcode] Combination Sum
- leetcode-39-Combination Sum
- 深度优先搜索和回溯(实例LeetCode 39 Combination Sum)
- 【Leetcode】【python】Combination Sum
- leetcode--Combination Sum
- LeetCode --- Combination Sum
- Leetcode: Combination Sum
- [LeetCode] Combination Sum
- (leetcode) Combination Sum
- LeetCode 10.7 Combination Sum
- leetcode39 Combination Sum
- LeetCode第39题之Combination Sum(两种方法)
- 【LeetCode】C# 39、Combination Sum
- LeetCode-Combination Sum-组合加和-回溯
- leetcode--Combination Sum
- [leetcode刷题系列]Combination Sum
- LeetCode: Combination Sum
- leetcode 刷题之路 23 Combination Sum
- [leetcode] Combination Sum
- Combination Sum - LeetCode