题目描述 给你一个 无重复元素  的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合  ,并以列表形式返回。你可以按 任意顺序  返回这些组合。
candidates 中的 同一个  数字可以 无限制重复被选取  。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1: 
1 2 3 4 5 6 输入:candidates = [2 ,3 ,6 ,7 ], target = 7  输出:[[2 ,2 ,3 ],[7 ]] 解释: 2  和 3  可以形成一组候选,2  + 2  + 3  = 7  。注意 2  可以使用多次。7  也是一个候选, 7  = 7  。仅有这两种组合。 
 
示例 2: 
1 2 输入: candidates = [2 ,3 ,5 ], target = 8  输出: [[2 ,2 ,2 ,2 ],[2 ,3 ,3 ],[3 ,5 ]] 
 
示例 3: 
1 2 输入: candidates = [2 ], target = 1  输出: [] 
 
提示: 
1 <= candidates.length <= 30 
2 <= candidates[i] <= 40 
candidates 的所有元素 互不相同  
1 <= target <= 40 
 
题目思路 
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 class  Solution   {    public  List<List<Integer>> combinationSum(int [] candidates, int  target) {         int  len = candidates.length;         List<List<Integer>> res = new  ArrayList<>();         if  (len == 0 ) {             return  res;         }         Deque<Integer> path = new  ArrayDeque<>();         dfs(candidates, 0 , len, target, path, res);         return  res;     }          private  void  dfs (int [] candidates, int  begin, int  len, int  target, Deque<Integer> path, List<List<Integer>> res)   {                  if  (target < 0 ) {             return ;         }         if  (target == 0 ) {             res.add(new  ArrayList<>(path));             return ;         }                  for  (int  i = begin; i < len; i++) {             path.addLast(candidates[i]);                          dfs(candidates, i, len, target - candidates[i], path, res);                          path.removeLast();         }     } }