使用递归进行子集求和?

时间:2016-02-11 00:31:29

标签: java recursion

我在java课程中遇到过一个问题,所以我的大学也是如此。我要求一些指示,因为我迷失了从哪里开始。我们的赋值要求输入“正整数以及目标值列表,并确定输入整数的子集数(如果有的话)总和到每个给定的目标值。” 如果我们有输入:

2 3 4 5

1

4

5

我们的输出应该是: 0

1

2

我理解这一点,并且知道如何做到这一点,但我失去了两点。

1,我们必须使用递归,#2,我们提供基本代码。我需要的是帮助理解如何使用骨架代码。我想自己解决它。使用代码或所需内容的一小部分的小例子将会有所帮助!

谢谢!

代码:

static int subsets( int[] a, int n, int target) {

// add your code here
}

public static void main(String args[]) throws IOException {

int a[] = new int[1000];


Scanner scanner = new Scanner(System.in);
Scanner setScanner = new Scanner(scanner.nextLine());

    int n=0;
    while( setScanner.hasNextInt() ) {
    a[n] = setScanner.nextInt();
    n++;
    if(n>1000) {
        System.out.println( "Too many integers!" );
        return;
    }
    }

    while( scanner.hasNextInt() ) {
    int target = scanner.nextInt();
    System.out.println( subsets(a, n, target) );
}

}

}

2 个答案:

答案 0 :(得分:0)

由于这是一个家庭作业问题,我不会给你任何代码;相反,我会给你几个指针(如提示,而不是C指针中的指针)

问题在于确定总计数量的子集数量。因此,您可以做的是使用数组和sum作为参数定义函数。循环遍历数组中的每个元素,并再次将以下参数传递给同一个函数:没有当前元素的数组和sum - current_element。我会留给你决定如何停下来。

提示:

  

当总和小于零时,表示存在与正确值相加的子集。您需要将全局值增加一个。当总和小于零时,表示最后一个值失败,您将要停止递归。

另一个问题:scanner.hasNextInt()无法正常工作。你想要做的是找到n,然后找到数组的元素。

您的第一行应为int number_of_elements = scanner.nextInt()。此变量表示数组中元素的数量。

然后,您想要读取整数number_of_elements次。所以,像这样:

for (int i = 0; i < number_of_elements; i++) {
    // Read another number
}

这样,您可以将a初始化为int[] a = new int[number_of_elements],这样您的数组就会合适。使用此方法,您只需要一台扫描仪,您的阵列可以与Integer.MAX_VALUE

一样长

答案 1 :(得分:0)

递归算法的目的是使问题变小并使用较小问题的结果来解决大问题,因此当调用子集(a,n,target)时,它应该只是这样做。 / p>

a是当前数组 n是数组中的数字数 目标是目标。

要做的第一件事就是检查a中的所有数字是否与目标

相加

然后需要知道任何子集是否与目标匹配。谁更好然后用修改后的a和n来问自己。