C++ 一种代替置换的快速算法

C++ 一种代替置换的快速算法,c++,algorithm,linear-algebra,graph-algorithm,C++,Algorithm,Linear Algebra,Graph Algorithm,我需要找到一个快速算法来解决一个输入和输出如下的问题 输入: n对整数作为操作数和三个运算符(+、-、*) 输出: 如果有人能把运算符放在所有操作数之间,结果是n个不同的数字,程序会说:“这是可能的。”。否则它会说:“这是不可能的。”。另一方面,允许重复运算符,但不允许重复结果。通常的方法是使用排列;但这非常耗时 例如: Input: 3 5 2 1 6 3 Output: Possible 对于本例,第一对操作数可能使用“-”运算符,其余操作数可能使用“+”运算符 有人能帮我解决这个

我需要找到一个快速算法来解决一个输入和输出如下的问题

输入:

n对整数作为操作数和三个运算符(+、-、*)

输出:

如果有人能把运算符放在所有操作数之间,结果是n个不同的数字,程序会说:“这是可能的。”。否则它会说:“这是不可能的。”。另一方面,允许重复运算符,但不允许重复结果。通常的方法是使用排列;但这非常耗时

例如:

Input:
3  5 
2  1
6  3
Output:
Possible
对于本例,第一对操作数可能使用“-”运算符,其余操作数可能使用“+”运算符


有人能帮我解决这个问题的快速算法吗(我也必须使用c++)?

你可以把这个问题转化为最大流问题

让我们用
N
表示成对数(方程式)

首先,请注意,对于每一对,我们最多有三个可能的结果(因为我们有三个运算符)

考虑所有方程的所有可能结果集,让我们将这组数字表示为
A

构建一个图
G
,该图将有两个特殊节点
s
(源)、
t
(汇),一个节点对应于
a
的每个元素,最后一个节点对应于
N
的每个数字输入对

G
的边将按如下方式创建:

  • s
    A
    对应的每个节点的边
  • 从对应于
    A
    的每个节点到对应于一对数字的每个节点的边,该对数字可以从
    A
    产生相应的结果(请记住,每个输入对可能产生3个不同的值)
  • 从每个节点到接收器
    t
    对应于等式的边
为每个边指定一个等于1的容量

现在,运行最大流算法。如果流的值等于
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
    的每个节点到对应于一对数字的每个节点的边,该对数字可以从
    A
    产生相应的结果(请记住,每个输入对可能产生3个不同的值)
  • 从每个节点到接收器
    t
    对应于等式的边
为每个边指定一个等于1的容量

现在,运行最大流算法。如果流的值等于
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是一个关于代码的问答网站。如果主要关注的是算法设计,那么您在或其他堆栈交换方面可能会有更好的运气