java求子集和,给定数组求这个数组中某些数字相加等于某个值的所有可能集合

先说明这只是一种写法,算法很多,欢迎评论区有更多的写法
网上百度资料 都说什么穷举、回溯之类的 但是没有一个直接给答案的,很烦,但是我这个没有详细优化,只是为了实现,数组太大就需要优化 直接上代码 不多BB

public static void main(String[] args) {  
	       int[] arr = new int[10]; 
		   for(int i = 0; i < 10; i++){
	        	arr[i] = (int)(Math.random()*100);
	       }
		   System.out.println(Arrays.toString(arr));
		   Test test = new Test();
		   
		   test.getsubset(arr, 100, 0);
	    }
	      
	    LinkedList list = new LinkedList<>();

		private int getsum(LinkedList list) {
			int sum = 0;
			Iterator iterator = list.iterator();
			while(iterator.hasNext()){
				sum += iterator.next();
			}
			return sum;
		}

		private void getsubset(int[] a, int m, int i) {
			while (i < a.length) {
				list.add(a[i]);
				if (getsum(list) == m) {
					System.out.println(list);
				}
				i++;
				getsubset(a, m, i);
				list.remove(list.size() - 1);
			}
		}

下面贴上我在项目使用的工具类


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * 给定数组,求子集和相加等于某个给定的数
 */
public class Subset {

	    private static List list = new ArrayList<>();
		
		public static List> getSubset(int[] a, int m, int i) {
			List> resList = new ArrayList<>();
			while (i < a.length) {
				list.add(a[i]);
				if (getsum(list) == m) {
					resList.add(list);
					return resList;
				}
				i++;
				getSubset(a, m, i);
				list.remove(list.size() - 1);
			}
			return resList;
		}

		private static int getsum(List list) {
			int sum = 0;
			Iterator iterator = list.iterator();
			while(iterator.hasNext()){
				sum += iterator.next();
			}
			return sum;
		}
		
		public static void main(String[] args) {  
			int[] arr = {6,6,6,6}; 
			System.out.println(Arrays.toString(arr));
			System.out.println(Subset.getSubset(arr, 18, 0));
		}
		
}

原创:影公子 ——转载请注明原帖链接

你可能感兴趣的:(数据结构与算法)