struct Node
{
vector<int> a;
int sum;
int index;
Node(){}
Node(int index,int sum,vector<int> a)
{
this->index = index;
this->sum = sum;
this->a = a;
}
};
class Solution {
public:
queue<Node> q;
map<int,int> m;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<vector<int>> ans;
for(int i=0;i<candidates.size();i++)
{
if(m[candidates[i]]==0)
{
vector<int> a;
a.push_back(candidates[i]);
q.push(Node(i,candidates[i],a));
m[candidates[i]]=1;
}
}
while(!q.empty())
{
Node term = q.front();
q.pop();
if(term.sum==target)
{
ans.push_back(term.a);
continue;
}
if(term.sum>target)
{
continue;
}
m.clear();
for(int i=term.index+1;i<candidates.size();i++)
{
if(m[candidates[i]]==1)
continue;
if(term.sum+candidates[i]>target)
continue;
else if(term.sum+candidates[i]==target)
{
vector<int> x = term.a;
x.push_back(candidates[i]);
ans.push_back(x);
m[candidates[i]]=1;
}
else
{
vector<int> x = term.a;
x.push_back(candidates[i]);
q.push(Node(i,term.sum+candidates[i],x));
m[candidates[i]]=1;
}
}
}
return ans;
}
};