这是那些困难的算法之一,因为有很多选择。想象一个数字' N'和一组10岁以下的素数,即{2,3,5,7}。目标是保持N分,直到达到1.如果在任何步骤N不能被任何给定的素数整除,那么你可以进行以下操作:
i)N = N-1 或ii)N = N + 1
这将确保N是偶数,我们可以继续。
应该在使用最少数量的操作时实现目标。
请注意,这可能听起来微不足道,即你可以在你的算法中实现一个步骤,如果N可以被任何素数整除,那么将它除去"。但这并不总能产生最佳解决方案
E.g。如果N = 134:现在134可以除以2.如果除以2,则得到67. 67不能被任何素数整除,所以你做一个操作,N将是66/68,这两个都需要另一个操作。总共2次操作。
或者,如果N = 134并且您进行操作N = N + 1,即N = 135,在这种情况下,达到1所需的总操作是1.因此这是最佳解决方案
答案 0 :(得分:2)
除非针对此问题有一些数学解决方案(如果您正在寻找数学解决方案,math.SE更适合此问题) - 您可以将问题减少到shortest path problem < /强>
将问题表示为图G=(V,E)
,其中V = N
(所有自然数)和E = {(u,v) | you can get from u to v in a single step }
1 。
现在,您需要从源(输入数字)到目标(数字1)运行经典搜索算法。获得最佳解决方案的一些选择是:
优化备注:
图形可以“动态”构建,无需将其创建为预处理。为此,您需要next:V->2^V
(从节点到一组节点)功能,以便next(v) = {u | (v,u) is in E}
PS 复杂性评论:BFS解决方案是伪多项式(在最坏情况下输入数字是线性的),因为您将开发的“最高”顶点是n+1
,所以解决方案基本上是O(n)
最坏的情况 - 尽管我认为更深入的分析可以将其限制在更好的限制。
(1)如果您只对+ 1 / -1感兴趣被视为操作,则可以在完成分割后根据目标创建边。
(2)如果使用admissible heuristic function。