我在学习动态编程,并且在理解更复杂的问题时遇到了很多麻烦。当遇到问题时,我被教会找到一个递归算法,记忆递归算法,然后创建一个迭代的,自下而上的版本。几乎在每一步我都有一个问题。就递归算法而言,我写了不同的方法来执行递归算法,但只有一种方法通常适用于动态编程,而且我无法区分递归算法的哪些方面使记忆更容易。就memoization而言,我不明白哪些值用于指数。为了转换为自下而上的版本,我无法确定填充阵列/双数组的顺序。查找低于或等于某个值的最大子序列
这是我的理解: - 它应该是可以分割的主要问题子问题
中提到的问题来看,我想出了一个递归算法有代码的这些重要品系:
int optionOne = values[i] + find(values, i+1, limit - values[i]);
int optionTwo = find(values, i+1, limit);
如果我不清楚或这不是正确的qa网站,请告诉我。
编辑:
实例:假设数组x:[4,5,6,9,11]和max值m:20
x中最大特亚或等于m。将[4 ,5,11] as 4 + 5 + 11 = 20
如果你举一个例子,最好给我们展示一下你的意思是“最大子序列低于一定值”。 – Shashank
我认为你所描述的问题是一个0-1背包问题,其中值相等。动态规划解决方案在这里给出.http://en.wikipedia.org/wiki/Knapsack_problem –