class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>> res;
vector<int> tmp;
sort(S.begin(),S.end());
dfs(res,tmp,0,S);
sort(res.begin(),res.end(),cmp);
return res;
}
static bool cmp(vector<int> a,vector<int> b){
if(a.size()==b.size()){
for(int i=0;i<a.size();i++)
if(a[i]!=b[i])
return a[i]<b[i];
}
return a.size()<b.size();
}
void dfs(vector<vector<int>> &res,vector<int> &tmp,int pos,vector<int> a){
res.push_back(tmp);
for(int i=pos;i<a.size();i++){
tmp.push_back(a[i]);
dfs(res,tmp,i+1,a);
tmp.pop_back();
}
}
};