繁体   English   中英

使用递归进行子集求和?

[英]Using Recursion for Subset Summation?

我在Java班上被一个问题困扰,大学也是如此。 我要一些指示,因为我迷失了从哪里开始。 我们的任务要求将输入“正整数和目标值列表一起使用,并确定多少个输入整数子集(如果有的话)加总到每个给定的目标值。” 如果我们有输入:

2 3 4 5

1

4

我们的输出应为: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) );
}

}

}

由于这是一个家庭作业问题,因此我不会给您任何代码。 相反,我会给你一些指针(如提示,而不是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

递归算法的重点是使问题更小,并使用较小问题的结果来解决较大的问题,因此,在调用子集(a,n,target)时,应该这样做。

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

首先要做的是检查a中的所有数字是否加在一起

那么它需要知道是否有任何子集与目标匹配。 谁最好再问自己修改的a和n。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM