簡體   English   中英

找到子集總和並返回它和子集

[英]Finding subset sum and returning it and the subset

我對 Java 和編碼相對較新,目前正在嘗試解決子集問題。

目標是讓用戶輸入數字的數量,然后輸入每個數字,直到指定的數量,計算機相應地要求每個第 n 個數字。

之后計算機應計算所有子集的總和,並返回最接近 pi 的子集,以及同一行中這種形式 [x,y,z] 的子集。
我很好地管理了第一部分,盡管為了方便起見,它可能已經通過開關盒進行了改進。 它將輸入數字添加到數組中

但我在這個問題的第二部分苦苦掙扎,我不知道如何推進/安排代碼,以便輸出所需的結果。 我得到的建議是,一個包含 n 個元素的集合的 for 循環:

for a from 0 to 2^n
 for i from 0 to n
  when the binary representation of x on has a 1 at the i-th position
   add data[i] to solution.

據說這應該找到數組的所有子集。 之后我應該添加每個元素,檢查與 pi 的距離是否減小並將元素添加到解決方案集中。 或者至少這是目標,但我的代碼不起作用,因為我不知道從哪里開始安排它。 我也不知道用什么來初始化 bestsum,或者二進制表示算法是如何工作的,或者如何按順序將元素添加到解決方案數組中。

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("How many numbers should be read? ");
        int count = input.nextInt();
        double data[] = new double[count];
        double solution[] = new double[count];
        double bestsum = Double.POSITIVE_INFINITY;


        for (int i = 0; i < count; i++) {
            if (i % 10 == 1) {
                System.out.println("Enter " + i + "st number: ");
                data[i] = input.nextDouble();
            } else if (i % 10 == 2) {
                System.out.println("Enter " + i + "nd number: ");
                data[i] = input.nextDouble();
            } else if (i % 10 == 3) {
                System.out.println("Enter " + i + "rd number: ");
                data[i] = input.nextDouble();
            } else {
                System.out.println("Enter " + i + "th number: ");
                data[i] = input.nextDouble();
            }

        }
        for (long x = 0; x <= Math.pow(2,20); x++) {
            for (int y = 0; y <= 20; y++) {
                if (((x >> y) & 1) == 1) {
                    data[y] = solution[y];
                }
                if (abs(bestsum + solution[y] - PI) < bestsum)
                    bestsum = bestsum + solution[y];
            }
        }

        System.out.println("Best sum: ");
        String sol = solution.toString();
        System.out.println(bestsum + sol);

這是我對這個問題的解決方案。

    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("How many numbers should be read? ");
    int count = input.nextInt();
    Double data[] = new Double[count];
    Double solution[] = new Double[count];
    Double bestsum = 0.0;     //sum for an emptyset
    Set<Double> bestSet= Collections.emptySet();
    Set<Set<Double>> powerSet = new LinkedHashSet<>();
    


    for (int i = 0; i < count; i++) {
        if (i == 0) {
            System.out.println("Enter " + (i+1) + "st number: ");
            data[i] = input.nextDouble();
        } else if (i == 1) {
            System.out.println("Enter " + (i+1) + "nd number: ");
            data[i] = input.nextDouble();
        } else if (i == 2) {
            System.out.println("Enter " + (i+1) + "rd number: ");
            data[i] = input.nextDouble();
        } else {
            System.out.println("Enter " + (i+1) + "th number: ");
            data[i] = input.nextDouble();
        }

    }
    for (int i = 0; i < (1<<count); i++)
    {
        int m = 1; // m is used to check set bit in binary representation.
        Set<Double> currentSet = new LinkedHashSet<>();
        for (int j = 0; j < count; j++)
        {
            if ((i & m) > 0)
            {       
                currentSet.add(data[j]);
            }
            m = m << 1;
        }
        powerSet.add(currentSet);
    }
    Iterator<Set<Double>> iterator = powerSet.iterator();
    iterator.next();  //lets skip the first set which is an emptySet
    for (int i = 1; i < (1<<count); i++) {
        Double sum=0.0;
        Set<Double> currentSet = iterator.next();
        sum = currentSet.stream().collect(Collectors.summingDouble(Double::doubleValue));
        if(Math.abs(sum-Math.PI)<Math.abs(bestsum-Math.PI)) {
            bestSet = currentSet;
            bestsum = sum;
        }
        
    }

    System.out.println("powerSet: " + powerSet);
    System.out.println("solution: " + bestSet);
    System.out.println("bestsum: " + bestsum);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM