class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num int整型vector
     * @param target int整型
     * @return int整型vector<vector<>>
     */
    void dfs(const vector<int>& a, int start, int remain,
             vector<int>& path, vector<vector<int>>& res) {
        if (remain == 0) {                         // 命中目标
            res.push_back(path);
            return;
        }
        for (int i = start; i < a.size(); ++i) {
            if (a[i] > remain) break;              // 剪枝:后面更大,直接结束
            if (i > start && a[i] == a[i - 1]) continue; // 同层去重
            path.push_back(a[i]);
            dfs(a, i + 1, remain - a[i], path, res);   // 每个数只用一次
            path.pop_back();                       // 回溯
        }
    }
    vector<vector<int> > combinationSum2(vector<int>& num, int target) {
        // write code here
        vector<vector<int>> res;
        vector<int> path;
        sort(num.begin(), num.end());              // 先排序方便去重与剪枝
        dfs(num, 0, target, path, res);
        return res;
    }
};