class Solution {
public:
    vector< vector<int> >ans;
    vector<int> temp;

    vector<vector<int> > subsets(vector<int>& S) {
        sort(S.begin(), S.end()); //排序得到从小到大
        ans.push_back(temp);  //放入空集
        int n = S.size();
        for(int i=1; i<=n; i++){   //i表示子集长度;控制子集长度
            dp(S, i, 0);
        }
        return ans;
    }

    void dp(vector<int>& S, int len,int index){
        if(temp.size() == len){  //temp达到规定长度即添加
            ans.push_back(temp);
            return;
        }

        for(int i=index; i<S.size();i++){  //要加的这一位,使用循环尝试每个数;本层一定会加一位
            temp.push_back(S[i]);
            dp(S, len, i+1);  //加入当前后,那么从后面开始
            temp.pop_back();  //弹出,使用循环尝试下一个数
        }
        return;
    }
};