# 39. Combination Sum
###### tags: `C++` `LeetCode` `Medium` `Backtracking`
## Notes
```
題目要用某些數字組出一個目標數字
看起來是 backtrack
但是他要求不能有組成相同的組合出現
= example 1 =
candidates = {2, 3, 6, 7}
假如一個 result 在第一輪已經選了 3
那在接下來這一輪
他不能選擇 2
只能選擇 3 6 7
因為他如果這時候選擇了 2
他目前的組成就會和第一輪選擇 2 但是第二輪選擇 3 的人相同
重複就會發生
也就是每一次做 backtrack 的時候
你不能向前選擇已經錯過的選項
```
## Code
```c++
#include <vector>
#include <algorithm>
#include "cout.h"
vector<vector<int>> combinationSum(vector<int>& candidates, int target);
void combinationSumBacktrack(vector<int>& candidates, int target, int currentIndex, vector<int> result, vector<vector<int>> &results);
int main()
{
vector<int> nums = {2, 3, 6, 7};
coutVectorVector(combinationSum(nums, 7));
return 0;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
vector<vector<int>> results;
vector<int> result;
combinationSumBacktrack(candidates, target, 0, result, results);
return results;
}
void combinationSumBacktrack(vector<int>& candidates, int target, int currentIndex, vector<int> result, vector<vector<int>> &results)
{
int decisionNum = candidates.size();
if(target == 0)
{
results.push_back(result);
return;
}
if(target < 0)
{
return;
}
for(int i = currentIndex; i < decisionNum; i++)
{
result.push_back(candidates[i]);
combinationSumBacktrack(candidates, target - candidates[i], i, result, results);
result.pop_back();
}
return;
}
```