# 40. Combination Sum II
###### tags: `C++` `LeetCode` `Medium` `Backtracking`
## Notes
```
題目要用某些數字組出一個目標數字
看起來是 backtrack
但是不能有組成相同的組合出現
也不能使用重複的 element
= example 1 =
首先要對陣列進行 sort
這裡 sort 的目的不是排大小
只是要讓相同的數字聚集在一起
candidates = {2, 3, 3, 6, 7}
假如一個 result 在第一輪已經選了 2
那在接下來這一輪
他不能選擇 2
因為 2 已經選過了
不能使用重複的 element
只能選擇 3 3 6 7
如果這一輪他已經選過 3
那這一輪 for 迴圈裡面的其他 backtrack 不能再選 3
因為 3 已經被選過了
如果再有人選 3
即使他選的是第二個 3
他現在和選了第一個 3 的人目前的組成是相同的
會造成重複
因此他只能選 6 7
```
## Code
```c++
#include <vector>
#include <algorithm>
#include <climits>
#include "cout.h"
vector<vector<int>> combinationSum2(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 = {10, 1, 2, 7, 6, 1, 5};
coutVectorVector(combinationSum(nums, 8));
return 0;
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
{
vector<vector<int>> results;
vector<int> result;
sort(candidates.begin(), candidates.end());
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();
int lastDecision = INT_MAX;
if(target == 0)
{
results.push_back(result);
return;
}
if(target < 0)
{
return;
}
for(int i = currentIndex; i < decisionNum; i++)
{
if(candidates[i] != lastDecision)
{
result.push_back(candidates[i]);
combinationSumBacktrack(candidates, target - candidates[i], i + 1, result, results);
result.pop_back();
lastDecision = candidates[i];
}
}
return;
}
```