Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归打印数组中等于给定和的所有子集_Java_Arrays_Recursion_Subset_Subset Sum - Fatal编程技术网

Java 递归打印数组中等于给定和的所有子集

Java 递归打印数组中等于给定和的所有子集,java,arrays,recursion,subset,subset-sum,Java,Arrays,Recursion,Subset,Subset Sum,我必须用两种方法编写一个代码,它们将数组(非负)和值和作为参数。 我必须使用以下方法: 我们不允许为当前方法添加方法或任何更多参数。 我做了一些类似的事情,只是根据一个和打印来自给定数组的子集的数量。但是我很难改变它来完成这个任务。。。 我的数组长度限制为5 例如: “在数组中输入5个数字” 输入:12345 “在总和中输入一个数字” 投入:8 三, 为什么是3?(3,5)、(1,3,4)、(1,2,5) 谢谢你的帮助 我认为您必须将一个数字数组作为输入,并给出可以等于这个和的整数的和和和数

我必须用两种方法编写一个代码,它们将数组(非负)和值和作为参数。 我必须使用以下方法:



我们不允许为当前方法添加方法或任何更多参数。 我做了一些类似的事情,只是根据一个和打印来自给定数组的子集的数量。但是我很难改变它来完成这个任务。。。 我的数组长度限制为5

例如: “在数组中输入5个数字” 输入:12345 “在总和中输入一个数字” 投入:8 三,

为什么是3?(3,5)、(1,3,4)、(1,2,5)


谢谢你的帮助

我认为您必须将一个数字数组作为输入,并给出可以等于这个和的整数的和和和数

在您的示例中:

在数组中输入5个数字:1 2 3 4 5

在总和中输入一个数字:83(这里我认为3意味着它只需要3个数字就可以形成8,比如1 2 5和2 3 5..等等)

您可以这样做:

public static void printSubsetSums(int[] arr, int sum, int i) {
    // getting all possible sub arrays of a lentgh of i 
    ArrayList<int[]> subarrays = new ArrayList<int[]>();
    ArrayList<Integer> array = new ArrayList<Integer>();


    int arrSize = arr.length;
    for (int startPoint = 0; startPoint <arrSize ; startPoint++) {
        for (int grps = startPoint; grps <=arrSize ; grps++) {
            for (int j = startPoint ; j < grps ; j++) {
                int element = arr[j];
                array.add(element);
            }
            int[] tab = new int[array.size()];
            int x = 0;
            for(int n : array) {
                tab[x] = n;
                x++;
            }
            subarrays.add(tab);
            array.clear();

        }
    }
    // calculating the sum of each one of these arrays
    // print the ones that their sum equal the sum given with argument
    for(int[] al : subarrays) {
        if (al.length==3) {
            int sum2 = 0;
            for (int n : al) {
                sum2 = sum2 + n;
                System.out.print(n);
            }
            System.out.print(" = "+sum2);
            if(sum2==sum) { System.out.print(" that is a desired sum"); }
            System.out.println();
        }
    }

}
publicstaticvoidprintsubsetsums(int[]arr,int-sum,int-i){
//获取i的lentgh的所有可能子数组
ArrayList子数组=新的ArrayList();
ArrayList数组=新的ArrayList();
int arrSize=arr.length;

对于(int startPoint=0;startPoint,问题中强加的要求有点难以解释。但是,我已经编写了代码来满足您的用例

我采用的方法如下:

  • 使用位操作方法查找给定数组的所有可能子集

  • 检查子集的和是否等于给定的和。如果是,则在控制台上打印

  • 请查看下面的代码片段以了解更多信息

    import java.util.Scanner;
    
    public class SubsetSum {
        public static void printSubsetSums(int[] arr, int sum) {
            printSubsetSums(arr, sum, 0, "NotNeeded");
        }
    
        public static void printSubsetSums(int[] arr, int sum, int i, String acc) {
            // variable 'i' and 'acc' are not getting used anywhere.
            // Have added because you want to make the same syntax for the function.
            boolean isAnySubsetPossible = false;
            int n = arr.length;
    
            // Run a loop from 0 to 2^n
            for (int p = 0; p < (1 << n); p++) {
                int[] temporaryArray = new int[n];
                int k = 0;
                int m = 1; // m is used to check set bit in binary representation.
                // Print current subset
                for (int j = 0; j < n; j++) {
                    if ((p & m) > 0) {
                        temporaryArray[k++] = arr[j];
                    }
                    m = m << 1;
                }
    
                int localSum = 0;
                for (int temp : temporaryArray) {
                    localSum += temp;
                }
                if (localSum == sum) { // check if the sum is equal to the desired sum
                    isAnySubsetPossible = true;
                    for (int item : temporaryArray) {
                        if (item > 0) {
                            System.out.print(item + " ");
                        }
                    }
                    // print a new line so that next subset starts from new line
                    System.out.println();
                }
            }
            if (!isAnySubsetPossible) {
                System.out.println("There is no subset possible for the sum = " + 20);
            }
        }
    
        public static void main(String[] args) {
            Scanner myScanner = new Scanner(System.in);
            System.out.println("Enter 5 numbers into array");
            int[] myArr = new int[5];
            for (int i = 0; i < myArr.length; i++) {
                myArr[i] = myScanner.nextInt();
            }
            System.out.println("Enter a number into sum");
            int sum = myScanner.nextInt();
            printSubsetSums(myArr, sum);
        }
    }
    
    程序输出1

    Enter 5 numbers into array
    1 2 3 4 5
    Enter a number into sum
    8
    
    1 3 4 
    1 2 5 
    3 5
    
    Enter 5 numbers into array
    1 2 3 4 5
    Enter a number into sum
    20
    
    There is no subset possible for the sum = 20
    
    向程序输入2

    Enter 5 numbers into array
    1 2 3 4 5
    Enter a number into sum
    8
    
    1 3 4 
    1 2 5 
    3 5
    
    Enter 5 numbers into array
    1 2 3 4 5
    Enter a number into sum
    20
    
    There is no subset possible for the sum = 20
    
    程序输出2

    Enter 5 numbers into array
    1 2 3 4 5
    Enter a number into sum
    8
    
    1 3 4 
    1 2 5 
    3 5
    
    Enter 5 numbers into array
    1 2 3 4 5
    Enter a number into sum
    20
    
    There is no subset possible for the sum = 20
    

    我希望这能有所帮助。

    这里有一个递归方法来解决这个问题:

    publicstaticvoidprintsubsetsums(int[]arr,int-sum){
    打印子项(arr,总和,0,“”);
    }
    公共静态无效打印子事务(int[]arr,int sum,int i,String acc)
    {
    如果(总和=0&&!“.equals(acc)){
    系统输出打印项次(acc);
    acc=“”;
    }
    如果(i==arr.length){
    返回;
    }
    打印子科目(arr、sum、i+1、acc);
    打印子项(arr,总和-arr[i],i+1,acc+“”+arr[i]);
    }
    
    说明: 首先,将整数数组和所需的和输入调用帮助器方法的
    printsubems(int[]arr,int sum)
    方法(
    printsubems(int[]arr,int sum,int i,String acc)
    ),其中
    i
    arr
    的索引,
    acc
    是 如何达到总和的输出

    if(i==arr.length){return;}
    作为退出递归方法的基本情况(
    i
    超出范围)

    请注意,我们有两个递归调用(
    printsubsetsum(arr,sum,i+1,acc)
    printsubsetsum(arr,sum-arr[i],i+1,acc+“”+arr[i])
    )。如果当前数字无法达到总和,则第一个调用将起作用,因此
    i
    将递增为“重试”下一个数字在
    arr
    中。第二个选项是当前数字将起作用,因此您可以在计算当前数字的同时继续下一个索引(从
    sum
    中减去它,最终达到0[当我们知道所选数字加起来是10]并将其添加到
    acc

    最后,我们在
    为0时打印
    acc
    。我们还设置了
    acc=“”
    ,并避免在
    ”.equals(acc)
    时打印,以避免多次计算同一答案

    结果: 输入示例:

     3 5
     1 3 4
     1 2 5
    
    printSubsetSums(新的int[]{1,2,3,4,5},8)

    示例输出:

     3 5
     1 3 4
     1 2 5
    

    建议一种算法或方法,在给定所有子集和的情况下打印数组的元素/整数

    例如,给定子集的和;{0,1,2,3}-->数组的值为,arr[]={1,2},其子集为{{}->sum为'0',{1}->sum为'1',{2}->sum为2,{1,2}->sum为'3';
    注意:给定数组中的所有值均为正N>=0;

    请编辑您的问题,以包含您的尝试。理想情况下,这是一个最小的、可重复的示例。另外,“将其更改为执行此任务”是什么意思?@NewToJava我编辑了答案,为您提供了解决方案