【发布时间】:2017-01-22 11:12:58
【问题描述】:
目标
我想编写一个算法(在C 中),它返回TRUE 或FALSE(1 或0)取决于输入中给出的数组A 是否可以“求和和/或子”到x(请参阅下文以了解说明)。请注意,A 的所有值都是介于 [1,x-1] 之间的整数,它们是随机(均匀)采样的。
说明和示例
“和/或子”是指在数组的每个元素前面放置“+”和“-”并求和。我们称这个函数为SumSub。
int SumSub (int* A,int x)
{
...
}
SumSub({2,7,5},10)
应该以 7-2+5=10 的形式返回 TRUE。您会注意到A 的第一个元素也可以被视为负数,因此A 中的元素顺序无关紧要。
SumSub({2,7,5,2},10)
应该返回FALSE,因为无法对array 的元素进行“求和和/或减去”以达到x 的值。请注意,这意味着必须使用A 的所有元素。
复杂性
让n 成为A 的长度。如果必须探索所有可能的正负组合,则问题的复杂性为 O(2^n)。然而,一些组合比其他组合更有可能,因此值得首先探索(希望输出将是TRUE)。通常,需要从最大数中减去所有元素的组合是不可能的(因为A 的所有元素都低于x)。另外,如果n>x,尝试添加A的所有元素是没有意义的。
问题
我应该如何编写这个函数?
【问题讨论】:
-
听起来像是一个典型的背包问题。数组的元素和大小有限制吗?
-
我想使用我的资源可以处理的大小数组(就 CPU 时间而言)。
A的元素在 [1,x-1] 之间有界,其中x可以是任何无符号整数。 -
应该在 sum 和/或 sub 操作中使用数组中的 所有 值吗?
-
@trincot 是的,必须使用所有值
-
在这种情况下,这个问题与数学问题的不同之处在于:(为简单起见,假设
unsigned是 8 位的。)考虑SumSub({250, 250, 5, 5} 254).. 对于 C 来说这是真的 @ 987654350@ 溢出定义明确 - 只需添加 4 个元素。它在数学上是错误的,其范围是无限的。不确定 OP 想要什么,数学解决方案还是 C 解决方案。
标签: c arrays algorithm performance complexity-theory