【发布时间】:2022-01-08 10:07:38
【问题描述】:
使用加法和减法来获得数组中所有 N 个数字的总和的最佳方法是什么(在 C 中)?
例如(N = 3):
arr[] = [30, 14, 2]
results:
-30-14-2 = -46
-30-14+2 = -42
-30+14-2 = -18
-30+14+2 = -14
30-14-2 = 14
30-14+2 = 18
30+14-2 = 42
30+14+2 = 46
可以看出,有2^N个解。
我还注意到,加法和减法符号的交替方式与二进制计数 (000 001 ... 110 111) 相同,这可能很有用。
也许递归方法是最好的,但我发现递归思考非常困难。
因此,我希望有人能向我解释解决这个问题的最佳策略是什么。
—————————
编辑:
我有一个可用的 Python 代码,但这使用了集合 set(),这在 C 中不可用。(arr 是一个包含所有数字的数组。)
out = set()
out.add(0)
for i in range(0, len(arr)):
tmp = set()
for j in out:
tmp.add(j + arr[i])
tmp.add(j - arr[i])
out = tmp
print(out)
—————————
编辑:
通过用数组替换集合并进行一些小的更改,我得到了它的工作。感谢所有评论的人!
【问题讨论】:
-
这是一个观点:你不应该递归地这样做,而只是在两个循环中......一个循环操作(因为它们可以用累加器完成)和第二个循环值,您将获得结果而不会遇到内存问题。
-
建议:1) 我会考虑将此作为permutations 问题的重点。 2)我不知道递归是否“更好”,但是你可以用递归做任何事情,你也可以用循环做。 3)我不确定是否一定有 2^N 个“解决方案”。例如,“a+b”==“b+a”(它们是“相同的”);但是“a-b”“b-a”(它们是两种不同的“解决方案”)。
-
不用集合,只用一个数组。性能在这里有多重要?
-
如果您有解决方案,请考虑发布self answer 以帮助其他有同样问题的人。
-
有趣的是,结果的下半部分是上半部分的 (-1)。看起来你只需要做一半的数学,然后(-1)整个解决方案。
标签: c algorithm recursion permutation