Algorithm 给定一组数字和运算符,使用最少的运算次数形成给定的数字
在一次测试中,我们被问及以下问题,我不确定如何解决: 给定一组数字和一组运算符,找出生成该数字可能的最少操作数 例如:Algorithm 给定一组数字和运算符,使用最少的运算次数形成给定的数字,algorithm,data-structures,graph,dynamic-programming,breadth-first-search,Algorithm,Data Structures,Graph,Dynamic Programming,Breadth First Search,在一次测试中,我们被问及以下问题,我不确定如何解决: 给定一组数字和一组运算符,找出生成该数字可能的最少操作数 例如: 输入 一组数字:{8,1,6,2,7} 操作集:{*,/,-} 要生成的编号:981 输出 操作数:2 说明:981=16*62-11[2个操作:*和-] 约束条件: 用作整数的所有数字 0我们可以将此问题视为一个图问题,并使用BFS解决它 首先,我们尝试在不使用任何运算符的情况下从数字集创建所有可能的数字,称之为基集。这可以通过将每个数字分解为数字并检查所有这些数字是否属于数
输入
一组数字:{8,1,6,2,7}
操作集:{*,/,-}
要生成的编号:981 输出
操作数:2
说明:981=16*62-11[2个操作:*和-]
约束条件:
用作整数的所有数字
0我们可以将此问题视为一个图问题,并使用BFS解决它
首先,我们尝试在不使用任何运算符的情况下从数字集创建所有可能的数字,称之为基集。这可以通过将每个数字分解为数字并检查所有这些数字是否属于数字集来轻松实现
for(int i=0;i<1000;i++){
如果我可以由一组数字组成{
将i添加到基集;
}
}
现在,从作为起始顶点的基集中的每个数字开始,我们通过对基集中应用不同的操作符来遍历下一个顶点
Queue q=base set
int[]距离=新int[1000];
而q不是空的{
整数=q.pop();
for(int i:基本集){
for(运算符:运算符集){
int next=数字运算符i
如果next<1000&&next>=0&&next未访问{
将下一步标记为已访问;
距离[下一步]=1+距离[数字];
q、 添加(下一个);
}
}
}
}
返回距离[目标];
每个顶点将访问一次,因此时间复杂度将为O(n^2*m)
,其中n
是最大顶点数(本例中为1000个),而m
是运算符数运算符优先级规则如何?i、 e16*6+2*11
,操作将按哪个顺序执行?这是否等于(16*6)+(2*11)
,或((16*6)+2)*11
?@PhamTrung操作优先级将从左到右;不会遵循BODMAS/PEMDAS。我已经更新了这个问题。那么,16*6+2*11
将是((16*6)+2)*11
你了解BFS@PranjalVaswani吗?代码中你不理解的部分是什么?你的例子应该包括在内。基集包含13个,循环的第一次迭代可能已经找到26个。