版权声明:转载请标明出处 https://blog.csdn.net/weixin_40661297/article/details/89576005
问题:给定一个数组arr和整数target,求数组元素之和为target的组合
可以限定组合的元素个数
可以要求组合是否可以重复(例如{1,1,2,3}中能够组合和为4的有{1,3}和{1,3}还是只能一个{1,3},所以这个重复可不是指一个元素多次使用啊)
上代码
/**给定一个数组,求数组中给定个数count个元素之和为target的组合
* @author Archerlu
*
*/
public class CombinationSum1 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
int target = 7; //指定的元素要累加的和
int count = 2; //限定组合中的元素个数
//Arrays.sort(arr);//如果要求组合不能重复,就打开这个,(第一个)下面还得开启一个判断
List<List<Integer>> list = new ArrayList<>();
List<Integer> subList = new ArrayList<>();
recursion(arr,0,target,list,subList,0,count); //第一个0是数组的索引下标,范围(0,arr.length),第二个0表示累加的和
System.out.println(list);
}
private static void recursion(int[] arr, int index, int target, List<List<Integer>> list, List<Integer> subList,int sum,int count) {
//限定元素个数
/*if(subList.size()>count) {
return;
}
if(subList.size()==count&&sum==target) {
list.add(new ArrayList(subList));
}*/
//不限定元素个数
if(sum==target) {
list.add(new ArrayList(subList));
}
for(int i=index;i<arr.length;i++) {
//if(i>index&&arr[i]==arr[i-1]) continue;//如果要求组合不能重复,就要开启这个(第二个)
subList.add(arr[i]);
sum+=arr[i];
recursion(arr,i+1,target,list,subList,sum,count);
sum-=arr[i];
subList.remove(subList.size()-1);
}
}
}