有两个长度相等的整数数组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]
答案 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]
)。