vector<vector<int> > combinationSum2(vector<int> &num, int target) {
     sort(num.begin(), num.end());
     vector<vector<int> > result;
     vector<int> solution;
     combinationHelper(num, solution, result, target, 0);
     sort(result.begin(), result.end());
     vector<vector<int> >::iterator last = unique(result.begin(), result.end());
     result.erase(last, result.end());
     return result;
 }
 void combinationHelper(vector<int> &num, vector<int> &solution, vector<vector<int> > &result, int target, int start) {
     for(int i = start; i != num.size(); ++i){
         if(target == num[i]){
             solution.push_back(num[i]);
             result.push_back(solution);
             solution.pop_back();
         }else if(target > num[i]){
             solution.push_back(num[i]);
             combinationHelper(num, solution, result, target-num[i], i+1);
             solution.pop_back();
         }else return;
     }
 }
 void combinationHelper(int& counter, int target, vector<int>& nums) {
     if(target < 0) {
         return;
     }
     
     if(target == 0) {
         counter += 1;
     }
     
     for(int i = 0; i < nums.size(); i++) {
         target -= nums[i];
         combinationHelper(counter, target, nums);
         target += nums[i];
     }
 }
 int combinationSum4(vector<int>& nums, int target) {
     int counter = 0;
     combinationHelper(counter, target, nums);
     return counter;
 }