递归+回溯直接搞定
题目要求需要升序排列,所以提前将S sort一下就可以了。从0开始,每个位置都从之后的所有位置开始新一轮的选择。

class Solution {
public:
    vector<vector<int> > vres;
    vector<vector<int> > subsets(vector<int> &S) {
        vector<int> tmp;
        sort(S.begin(), S.end());
        subs(S, 0, tmp);
        return vres;
    }
    void subs(vector<int> &s, int is, vector<int> &tmp) {
        vres.push_back(tmp);
        for(int i = is; i < s.size(); i++) {
            tmp.push_back(s[i]);
            subs(s, i+1, tmp);
            tmp.pop_back();
        }
    }
};