回溯:先排序,后回溯,注意剪掉已经使用过的元素
去重:如果前一个元素与当前元素相同,那么没有必要再用当前元素进行后续的回溯

function combinationSum2( num ,  target ) {
  if (!num.length) return []
  num.sort((a, b) => a - b)
  let result = []
  function dfs(path, sum, ind) {
    if (sum === target) return result.push([...path])
    else if(sum > target) return
    for(let i = ind; i < num.length; i ++) {
      if (i > ind && num[i] === num[i - 1]) continue
      path.push(num[i])
      dfs(path, sum + num[i], i + 1)
      path.pop()
    }
  }
  dfs([], 0, 0)
  return result
}