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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34203492/article/details/78748436

先说明这只是一种写法,算法很多,欢迎评论区有更多的写法
网上百度资料 都说什么穷举、回溯之类的 但是没有一个直接给答案的,很烦,但是我这个没有详细优化,只是为了实现,数组太大就需要优化 直接上代码 不多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<Integer> list = new LinkedList<>();

        private int getsum(LinkedList<Integer> list) {
            int sum = 0;
            Iterator<Integer> 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<Integer> list = new ArrayList<>();

        public static List<List<Integer>> getSubset(int[] a, int m, int i) {
            List<List<Integer>> 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<Integer> list) {
            int sum = 0;
            Iterator<Integer> 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));
        }

}

原创:影公子 ——转载请注明原帖链接
———————-Java技术学习交流群467047721
点击链接加入群【Java技术学习交流群】:https://jq.qq.com/?_wv=1027&k=48DlKMY

猜你喜欢

转载自blog.csdn.net/qq_34203492/article/details/78748436