我只能想到蛮力解决方案。我该如何执行递归?

时间:2016-07-12 06:15:34

标签: c++ arrays recursion

  

有两个长度相等的整数数组A和B.将A的元素添加到B的元素中,以便B中的所有元素变得相等(如果可能)。人们可以将i的元素添加到i或i + 1(如果i!= len(A))B元素,或者不添加任何内容并继续下一个元素。 A的元素只能使用一次。

示例: B = [3,5,4,2],A = [2,1,2,1]

B [0] + = A [0]

B [2] + = A [1]

B [3] + = A [2] + A [3]

因此,B变为[5,5,5,5]

1 个答案:

答案 0 :(得分:1)

我不会考虑这个问题的递归。一个简单的while就足够了。

首先要注意的是b_new [0]只能有两个值

b_new[0] = b[0];        // and a[0] not used
b_new[0] = b[0] + a[0]; // and a[0] used

对于b_new [1],留下4种可能性

b_new[1] = b[1];               // and a[1] not used
b_new[1] = b[1] + a[0];        // and a[1] not used, only valid if a[0] wasn't used
b_new[1] = b[1] + a[0] + a[1]; // and a[1] used, only valid if a[0] wasn't used
b_new[1] = b[1] + a[1];        // and a[1] used

对于这些,你应该始终优先考虑这两个,以便[1]可以自由地用于计算b [2]。

在一个函数中表示:

int tryit(int idx, int target, int* a, int* b, int previous_a_used)
{
  if (b[idx] == target)
  {
    return 0; // a[idx] is free
  }

  if (!previous_a_used)
  {
    if ((b[idx] + a[idx-1]) == target)
    {
      printf("Trying: b[%d] += a[%d]\n", idx, idx-1);
      return 0; // a[idx] is free
    }

    if ((b[idx] + a[idx-1] + a[idx]) == target)
    {
      printf("Trying: b[%d] += a[%d] + a[%d]\n", idx, idx-1, idx);
      return 1; // a[idx] is used
    }
  }

  if ((b[idx] + a[idx]) == target)
  {
    printf("Trying: b[%d] += a[%d]\n", idx, idx);
    return 1; // a[idx] is used
  }

  return -1; // failed - no solution
}

该功能可以像:

一样使用
  printf("Trying: b[%d] += a[%d]\n", 0, 0);

  target = b[0] + a[0];   // Try one of the two possibilities for target
  previous_a_used = 1;    // a[0] was used
  idx = 1;                // move on to next index for b

  while (idx < N)
  {
    previous_a_used = tryit(idx, target, a, b, previous_a_used);
    if (previous_a_used < 0)
    {
      printf("failed\n");
      break;
    }
    ++idx; // move on to next index for b
  }

  if (previous_a_used >= 0)
  {
    printf("Solved\n");
  }

请记住添加用于检查其他目标值的代码(即target = b[0])。