Algorithm 在编程术语中,什么是回溯解决方案?

Algorithm 在编程术语中,什么是回溯解决方案?,algorithm,recursion,dynamic-programming,backtracking,recursive-backtracking,Algorithm,Recursion,Dynamic Programming,Backtracking,Recursive Backtracking,我有几个问题,关于回溯解决方案的真正含义 比如说,当前状态下有n个选项,是否进行回溯 解决方案基本上意味着您尝试所有这些状态,并且 子问题也是如此(其中可能有n-1个状态 解决方案),等等,然后从 (n-1)第n帧到第n帧 参见下面的问题,其中:给定长度为n的绳索,如何将绳索切割成长度为n[0],n[1],…,n[m-1]的m个部分,以获得n[0]n[1]的最大乘积*n[m-1]长度为2*3*3的Soa绳索将被切割成18的产品。 , 公共类RopeCuttingMaxProduct { 公共静态

我有几个问题,关于回溯解决方案的真正含义

  • 比如说,当前状态下有n个选项,是否进行回溯 解决方案基本上意味着您尝试所有这些状态,并且 子问题也是如此(其中可能有n-1个状态 解决方案),等等,然后从 (n-1)第n帧到第n帧
  • 参见下面的问题,其中:给定长度为n的绳索,如何将绳索切割成长度为n[0],n[1],…,n[m-1]的m个部分,以获得n[0]n[1]的最大乘积*n[m-1]长度为2*3*3的Soa绳索将被切割成18的产品。 ,

    公共类RopeCuttingMaxProduct
    {
    公共静态void main(字符串[]args)
    {
    系统输出println(fun(8));
    }
    静态整数乐趣(整数n)
    {
    如果(n==1)
    返回1;
    int totalret=0;
    对于(int i=1;i totalret)
    totalret=reti;
    }
    返回totalret;
    }
    静态整数最大值(整数a、整数b)
    {
    返回a>b?a:b;
    }
    }
    
  • 那么,所有回溯解决方案的时间复杂度都是指数级的吗
  • 这听起来很像递归,我无法想象 这是通过任何其他递归实现的。你能给我一个电话吗 无递归实现的回溯解决方案示例
  • 它与暴力有何不同。是这个问题的蛮力解决方案,尝试所有可能的方式组合,使之相加到n。我发现上面的回溯解决方案做的差不多

  • 如果你考虑你的算法是一个决策树的遍历,那么解决方案,如果它存在,是树的一些叶节点,或者如果有多个解决方案,那么有多个叶子节点代表它们。 回溯仅仅意味着算法在某个点检测到在当前所在树的分支中找不到解决方案,然后向上移动一个或多个节点以继续使用其他分支

    这并不意味着需要访问所有节点。例如,如果算法检测到当前分支在实际到达某个叶之前不值得执行,那么它将避免访问该分支中的所有剩余节点

    因此,并非所有回溯算法都是蛮力

    这种算法可以避免多少不必要的工作,这是非常具体的问题,它不能回答一般。一般的答案是,回溯不一定基于彻底的搜索/试验

    public class RopeCuttingMaxProduct
    {
        public static void main(String[] args)
        {
            System.out.println(fun(8));
        }
    
        static int fun(int n)
        {
            if(n == 1)
                return 1;
    
            int totalret = 0;
            for(int i = 1;i<n;i++)
            {
                /*At every frame, two options 1.to cut 2.to not cut
                 *  1.If cutting, multiple ways to cut : Remember i+(n-i) == n
                 *  2.If not cutting, just return n
                 */
                /* Explore all possible solutions, from all possible paths 
                 * and the subpaths that these lead to,
                 * and their subpaths*/
                int reti = max(fun(n-i)*i,n);
    
                if(reti > totalret)
                    totalret = reti;
            }
            return totalret;
        }
    
        static int max(int a, int b)
        {
            return a>b?a:b;
        }
    }