最近我遇到了一个类似这样的问题。您将得到n编号和三个运算符+、-和*。使用第一个n-1数和三个给定的运算符,您必须检查是否有一种方法将它们组合起来,给出‘n’号作为解决方案。
输入是一组数字,输出是Y或N。
示例
给定数字10 9 7 1 10 8.我们可以精确地使用n-1数字一次。该示例的输出是Y,因为存在一个解决方案,即(10-10)*9+(7+1)=8。
我的方法到现在为止。
我很难找到一种非暴力的方法来解决这个问题。我使用的基本思想是这个。我将首先计算n-1数集的每个排列,然后在数字之间的每个n-2空间中插入操作符的所有可能排列,并计算得到的表达式。我一直无法编码这一点,而且我怀疑这甚至是正确的。请指导我如何着手解决这个问题。我在用C++。
发布于 2014-02-27 07:46:00
我认为基本上你会创造出一套非常大的树。树的顶端有n个数字.通过以下方法创建树的下一个级别:
重复此操作,直到集合缩小到1大小为止。
使用您的示例:10 9 7 1 10 8
10 10 9 7 110 10和7 1的相邻数对的子集*和*的操作的排列10*10 => 100和7*1 ==> 7 )相结合来减少集合100 9 7重复一遍。您将为数字的每一个排列、相邻数的每个子集以及操作的每个置换创建一个新树。请记住,相邻数子集的大小q可以是1,M /2。
对于“大”N,这将是内存和计算密集型。实际实现可能取决于实际可用的硬件。一些优化可以是:
而且,这种类型的问题并不是真正的C++.用一种功能更强的语言(比如scala,甚至ruby )来编写它会更容易。
很酷的问题BTW。
发布于 2014-02-27 08:17:23
人们想到了两种办法:
https://stackoverflow.com/questions/22060753
复制相似问题