У меня есть пара вопросов о том, что на самом деле означает решение с возвратом.
- Скажем, у вас есть n вариантов из текущего состояния, значит ли решение с возвратом в основном означает, что вы пробуете все эти состояния и делаете то же самое для подзадач (где у вас может быть n-1 состояний для решения), и и так далее, и вы возвращаете лучшее решение от (n-1)-го кадра до n-го кадра.
См. задачу ниже, где: Данная веревка длины n, как разрезать веревку на m частей длиной n[0], n[1], ..., n[m-1], чтобы получить максимальное произведение n[0]n[1] ... *n[m-1] Итак, веревку длины нужно разрезать на 2*3*3, чтобы получить произведение из 18. ,
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;
}
}
- Итак, все ли решения с возвратом экспоненциальны по временной сложности?
- Это так похоже на рекурсию, что я не могу себе представить что-то подобное, достигнутое с помощью какой-либо другой рекурсии. Можете ли вы привести пример решения с возвратом, достигнутого без рекурсии?
- Чем он отличается от грубой силы. Является ли решение этой проблемы грубой силой, чтобы попробовать все возможные комбинации способов сложения до n. Я считаю, что приведенное выше решение для обратного отслеживания делает почти то же самое.