C中的递归函数(2个子阵列)

时间:2012-12-21 16:21:49

标签: c recursion integer partitioning knapsack-problem

我们在类中有一个类似的代码:

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),则此代码返回1。我想扩展此函数,以便它将返回带有数字的两个数组。

对于1,2,2,3,0的输入,它应该返回: arr1:2,2 arr2:3,1

我该怎么做?我不能使用循环,只能使用递归函数。

1 个答案:

答案 0 :(得分:1)

你的前提条件不正确:你写了

  

如果数组可以分成两个具有相等和的子数组,则此代码返回1.

事实并非如此。用

进行测试
int main() {
   int a[5];
   a[0] = 1; a[1] = 0; a[2] = 0; a[3] = 0; a[4] = 0;

   int const r1 = SubsetSum(a, 0, 5, 1);
   printf("%d\n", r1);

   return 0;
}

这会返回'1' - 即使它不能被分成具有相等和的子数组。

请考虑您的代码并准确描述您想要的内容。