Answer for question 5 (c). Let b=2^k. Dynamic programming takes O(n*2^k) time. Recursive algorithm takes O(k*2^n) time. Those two complexities are very symmetric over k and n. For small k (or b), (1) runs fast. For small n, (2) runs fast. For large k, (1) runs out of space. For large n, (2) does not run out of space.