Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 何时使用回溯?_Algorithm_Recursion_Backtracking - Fatal编程技术网

Algorithm 何时使用回溯?

Algorithm 何时使用回溯?,algorithm,recursion,backtracking,Algorithm,Recursion,Backtracking,有时我看到一个问题,我不确定我的第一反应是暴力对待所有可能的解决方案+记忆,还是尝试聪明地解决问题。例如,这个问题: 给定一个正整数n,您可以执行以下操作: 如果n为偶数,则将n替换为n/2。如果n是奇数,可以用 n+1或n-1。更换的最低数量是多少 n需要变成1吗 一个人怎么知道不为某个给定的n(例如:1+[func(n+1)、func(n-1)、func(n/2)].min而不是寻找更智能的解决方案?你怎么知道有这种本能?试着考虑程序是否可以表示为一系列较小的子问题。如果可以,那么这个问题是

有时我看到一个问题,我不确定我的第一反应是暴力对待所有可能的解决方案+记忆,还是尝试聪明地解决问题。例如,这个问题:

给定一个正整数n,您可以执行以下操作:

如果n为偶数,则将n替换为n/2。如果n是奇数,可以用 n+1或n-1。更换的最低数量是多少 n需要变成1吗


一个人怎么知道不为某个给定的n(例如:
1+[func(n+1)、func(n-1)、func(n/2)].min
而不是寻找更智能的解决方案?你怎么知道有这种本能?

试着考虑程序是否可以表示为一系列较小的子问题。如果可以,那么这个问题是动态规划的一个很好的候选问题,你可以尝试构造一个递归来表示t这通常是关于识别模式和类似问题的(比如(user3802348)。有时你会立即看到DP的本质并能对其进行分析。有时你会觉得一个问题是NP完全的,因为它与一些已知的问题非常相似。同样,需要进行分析。因此了解许多方法,包括它们的内部工作原理(和一些问题)基本上是知识在这里起到了帮助作用。这就是为什么除了琐碎的算法之外,其他算法的设计是困难的。有些人花毕生的时间磨练知识和直觉来“看”正确的前进方向。即使如此,仍有大量的尝试和发现。这是通过实践获得的真正技能。当然,天赋也很重要。在1到100的范围内,这个分数约为2,但这只是一个开始。继续解决尽可能多的问题。@sascha概述了基本方法:猜测NP难或存在多个问题me算法。如果是第一种算法,请寻找证明,否则请寻找算法。如果失败,请尝试另一种算法。有时解决问题的好方法是反向操作,即自下而上。在这种情况下,从1开始,记下达到特定状态所需的最小步数(值n).因为n是一个正整数,它将搜索1->2->3或4..等等。这样可以保证DP算法在n中是线性的。谢谢大家的评论。很高兴标记为正确答案。@sascha+Gene,这是一个特别有见地的基因——考虑到程序可以表示为一系列较小的子问题。如果可以,则该问题是动态规划的一个很好的候选问题,您可以尝试构造一个递归来表达这种关系。它通常涉及识别模式和类似问题(如(user3802348)的示例)。有时你会立即看到DP的本质并能对其进行分析。有时你会觉得一个问题是NP完全的,因为它与一些已知的问题非常相似。同样,需要进行分析。因此了解许多方法,包括它们的内部工作原理(和一些问题)基本上是知识在这里起到了帮助作用。这就是为什么除了琐碎的算法之外,其他算法的设计是困难的。有些人花毕生的时间磨练知识和直觉来“看”正确的前进方向。即使如此,仍有大量的尝试和发现。这是通过实践获得的真正技能。当然,天赋也很重要。在1到100的范围内,这个分数约为2,但这只是一个开始。继续解决尽可能多的问题。@sascha概述了基本方法:猜测NP难或存在多个问题me算法。如果是第一种算法,请寻找证明,否则请寻找算法。如果失败,请尝试另一种算法。有时解决问题的好方法是反向操作,即自下而上。在这种情况下,从1开始,记下达到特定状态所需的最小步数(值n).因为n是一个正整数,它将搜索1->2->3或4..等等。这样可以保证DP算法在n中是线性的。谢谢大家的评论。很高兴标记为正确答案。@sascha+Gene,特别有洞察力--我一定会注意NP难的比较