具有给定总和的整数子数组,使用C中的递归

时间:2012-12-17 21:07:40

标签: c recursion integer sum arrays

我有一项非常艰巨的任务,我发现很难处理。

我正在尝试编写一个递归函数(根本没有循环),给定一个数组及其长度,将打印一对子数组,每个子数的总和将是整个数组总和的一半。换句话说,数组将被分为两组整数,以使它们的总和相等。

例如,给定数组{1,2,2,0,5},函数应输出{1,2,2} {0,5}

我必须递归地执行它,使用只获取数组本身及其大小的函数。我也只允许使用一个额外的递归函数来解决问题。

任何想法或想法都将受到最高的赞赏。

再次问好! 我们在课堂上得到了一个像这样的代码

int SubsetSum(int arr[], int idx, int n, int S) {
if (S==0) return 1; //This is stopping condition #1.
if (S<0 || n==0) return 0; //This is stopping condition #2.
return SubsetSum(arr, idx+1, n-1, S-arr[idx]) || SubsetSum(arr, idx+1, n-1, S);
}

“||”运算符在递归方面意味着什么? 谢谢你!

2 个答案:

答案 0 :(得分:1)

您首先计算整个数组的总和(它最好是),这样就可以得到一半的总和,您可以使用binary knapsack例程来实现。

Java中还有一个recursive implementation on Stack Overflow,它与C没有太大区别,可以满足您的要求。

答案 1 :(得分:0)

从中间划分数组和子数组,直到只有一个元素。

将第一个元素与第二个元素进行比较,找到这些整数的总和。

之后使用这些总和进行二进制元素比较。比较时找到总和。例如,您的子阵列是{1,2}和{0,3}。查看第一个元素0和1.当您看到小元素时,取该子数组中的另一个元素({0,3})。之后该总和为3.另一部分的总和为1并取另一个元素(2)。现在两者的总和是3。您可以将其用于所有子阵列。

我不确定解决方案。但我认为这似乎是分而治之的算法。