我现在正在研究DP,但是我之前碰到过一些示例,例如子集总和或此问题中显示的硬币更改问题,它们的解决方案称为递归案例 ,均包括当前元素,但不包括当前元素 。但是,通过这种方法,我确实很难理解什么/为什么是真正的原因。我无法理解其背后的逻辑。我不想记住或说“哼,好吧,请记住,有一种方法” 。
malloc
我不想从表面上跳过这些部分,因为递归公式在动态编程中确实起着主导作用。
答案 0 :(得分:1)
在每次递归中,您都希望探索两种情况:
在两种情况下,其余任务都通过递归调用来处理。
顺便说一下,该解决方案与动态编程无关。
在常见的幂集问题中,给定(1 2 3)
,要求我们生成((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) ())
。我们可以使用 with 和 without 技术来生成结果。
+---+ +---------------------------+ +--------------------------------------------+
| +-with----> ((1 2 3) (1 2) (1 3) (1)) | | |
| 1 | | +-----> ((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) ()) |
| +-without-> ((2 3) (2) (3) ()) | | |
+-^-+ +---------------------------+ +--------------------------------------------+
|
+-------------------------------------------+
|
+---+ +-------------+ +-----------+--------+
| +-with------> ((2 3) (2)) | | |
| 2 | | +---> ((2 3) (2) (3) ()) |
| +-without---> ((3) ()) | | |
+-^-+ +-------------+ +--------------------+
|
+--------------------------------+
|
+---+ +-----+ +------+--------+
| +-with------> (3) | | |
| 3 | | +-----> ((3) ()) |
| +-without---> () | | |
+-^-+ +-----+ +---------------+
|
|
+-+-+
|() |
| | <- base case
+---+