C++ 一种代替置换的快速算法
我需要找到一个快速算法来解决一个输入和输出如下的问题 输入: n对整数作为操作数和三个运算符(+、-、*) 输出: 如果有人能把运算符放在所有操作数之间,结果是n个不同的数字,程序会说:“这是可能的。”。否则它会说:“这是不可能的。”。另一方面,允许重复运算符,但不允许重复结果。通常的方法是使用排列;但这非常耗时 例如:C++ 一种代替置换的快速算法,c++,algorithm,linear-algebra,graph-algorithm,C++,Algorithm,Linear Algebra,Graph Algorithm,我需要找到一个快速算法来解决一个输入和输出如下的问题 输入: n对整数作为操作数和三个运算符(+、-、*) 输出: 如果有人能把运算符放在所有操作数之间,结果是n个不同的数字,程序会说:“这是可能的。”。否则它会说:“这是不可能的。”。另一方面,允许重复运算符,但不允许重复结果。通常的方法是使用排列;但这非常耗时 例如: Input: 3 5 2 1 6 3 Output: Possible 对于本例,第一对操作数可能使用“-”运算符,其余操作数可能使用“+”运算符 有人能帮我解决这个
Input:
3 5
2 1
6 3
Output:
Possible
对于本例,第一对操作数可能使用“-”运算符,其余操作数可能使用“+”运算符
有人能帮我解决这个问题的快速算法吗(我也必须使用c++)?你可以把这个问题转化为最大流问题 让我们用
N
表示成对数(方程式)
首先,请注意,对于每一对,我们最多有三个可能的结果(因为我们有三个运算符)
考虑所有方程的所有可能结果集,让我们将这组数字表示为A
构建一个图G
,该图将有两个特殊节点s
(源)、t
(汇),一个节点对应于a
的每个元素,最后一个节点对应于N
的每个数字输入对
G
的边将按如下方式创建:
- 从
到s
对应的每个节点的边A
- 从对应于
的每个节点到对应于一对数字的每个节点的边,该对数字可以从A
产生相应的结果(请记住,每个输入对可能产生3个不同的值)A
- 从每个节点到接收器
对应于等式的边t
N
,则我们可以产生N
不同的结果
事实上,为了让N
流到达水槽,我们必须让前一层中的N
方程中的每个方程都有一个流。我们还可以通过查看A
中的哪个数字来获得每个方程的单位输入流量,从而恢复解
编辑: 请参见下面的上述算法的可视化,以了解以下输入对:
3 1
2 2
2 1
集合A
是{2,4,3,0,1}
。一些数字可以从多对中获得,例如2=3-1=2*1
。这样做的效果是,与编号2
对应的节点既连接到3 1
的节点,也连接到2 1
的节点
所有边缘都具有单位容量(如上所述)
运行从
s
到t
的最大流量算法后,结果是3
,粗体边说明了传递此流量的一种可能方法。这种情况下产生的解决方案是2=3-1
,4=2*2
,1=2-1
您可以将其转化为最大流量问题
让我们用N
表示成对数(方程式)
首先,请注意,对于每一对,我们最多有三个可能的结果(因为我们有三个运算符)
考虑所有方程的所有可能结果集,让我们将这组数字表示为A
构建一个图G
,该图将有两个特殊节点s
(源)、t
(汇),一个节点对应于a
的每个元素,最后一个节点对应于N
的每个数字输入对
G
的边将按如下方式创建:
- 从
到s
对应的每个节点的边A
- 从对应于
的每个节点到对应于一对数字的每个节点的边,该对数字可以从A
产生相应的结果(请记住,每个输入对可能产生3个不同的值)A
- 从每个节点到接收器
对应于等式的边t
N
,则我们可以产生N
不同的结果
事实上,为了让N
流到达水槽,我们必须让前一层中的N
方程中的每个方程都有一个流。我们还可以通过查看A
中的哪个数字来获得每个方程的单位输入流量,从而恢复解
编辑: 请参见下面的上述算法的可视化,以了解以下输入对:
3 1
2 2
2 1
集合A
是{2,4,3,0,1}
。一些数字可以从多对中获得,例如2=3-1=2*1
。这样做的效果是,与编号2
对应的节点既连接到3 1
的节点,也连接到2 1
的节点
所有边缘都具有单位容量(如上所述)
运行从
s
到t
的最大流量算法后,结果是3
,粗体边说明了传递此流量的一种可能方法。这种情况下产生的解决方案是2=3-1
,4=2*2
,1=2-1
给我们看一些你到目前为止试过的代码。你试过了吗?你知道如何创造一个新的世界吗?如果没有,请按照链接阅读文章。我没有尝试过任何代码,因为我首先要设计它的算法。@alikefayati Stack Overflow是一个关于代码的问答网站。如果主要关注的是算法设计,那么您在或其他堆栈交换方面可能会有更好的运气