class Solution {
private:
    vector<vector<int>> res;
    vector<int> path;
public:
    vector<vector<int> > subsets(vector<int> &S) {
        sort(S.begin(), S.end());
        for(int i=0; i<=S.size(); i++){
            dfs(S, 0, i);
        }
        return res;
    }
    
    void dfs(vector<int>& num, int start, int k){
        if(path.size() == k){
            res.push_back(path);
            return;
        }
        
        for(int i=start; i<num.size(); i++){
            path.push_back(num[i]);
            dfs(num, i+1, k);
            path.pop_back();
        }
        
    }
    
};