【问题标题】:recursive function in C (2 subarrays)C中的递归函数(2个子数组)
【发布时间】:2012-12-21 16:21:48
【问题描述】:

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

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

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

【问题讨论】:

  • 您没有提到这两个条件,但是数组是否以零结尾?即,只能在数组中存在非零值吗?
  • 是的,您可以假设要输入到原始数组中的数字是 0 或更大
  • 我对它们是否可以是非负数不感兴趣。我想知道它们可以是 0。
  • 顺便问一下,idxnS 变量是什么?
  • n 是数组的大小,而 S 是整个数组的总和。 idx 是要检查的原始数组的索引。一开始是0。

标签: c recursion integer partitioning knapsack-problem


【解决方案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' - 即使它不能被分成总和相等的子数组。

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

【讨论】:

  • 是的,你是对的。你可以假设数组的总和可以除以2。我在主函数上检查它
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2011-01-17
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多