1. 程式人生 > >java求子集和,給定陣列求這個陣列中某些數字相加等於某個值的所有可能集合

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<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