数组元素之和组合问题(递归)

版权声明:转载请标明出处 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);
		}
		
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40661297/article/details/89576005
今日推荐