void subsetHelper(int i, vector<int> & subset, vector<vector<int>> & ans, vector<int> & A){
    if(i==A.size()){
        ans.push_back(subset);
        return;
    }
    subsetHelper(i+1, subset, ans, A);
    subset.push_back(A[i]);
    subsetHelper(i+1, subset, ans, A);
    subset.pop_back();
}
void SubSetTest::subsetHelper( vector<vector<int>>& rst, vector<int>& list, const vector<int>& num, int pos )
{
	rst.push_back(list);

	for (int i = pos; i < num.size(); ++i)
	{
		list.push_back(num[i]);
		subsetHelper(rst, list, num, i + 1);
		list.pop_back();
	}
}
vector<vector<int>> SubSetTest::subset( const vector<int>& num )
{
	vector<vector<int>> rst;
	if (num.size() == 0)
	{
		return rst;
	}

	vector<int> list;
	vector<int> tmpNum = num;
	//sort(tmpNum.begin(), tmpNum.end(), less<int>());

	subsetHelper(rst, list, tmpNum, 0);

	return rst;
}
vector<vector<int> > Solution::subsets(vector<int> &A) {
    /*int s, e;
    sort(v.begin(), v.end());
	vector<int> temp(v.size()), empty;
	for(int i=0; i<v.size(); i++)
		temp[i] = 0;
	vector<vector<int> > result;
	result.push_back(empty);
	for(int i=0; i<v.size(); i++) {
		s = i+1; e = v.size() - 1;
		temp[0] = v[i];
		result = subsetsHelper(v, temp, result, s, e, 1);
	}
	return result;*/
	vector< vector<int> > ans;
    vector<int> subset;
    sort(A.begin(), A.end());
    subsetHelper(0, subset, ans, A);
    sort(ans.begin(), ans.end());
    return ans;
}