We dynamically adapted our search space as we were exploring possibilities. To recap, here's how branch and bound works: 1. Divide the problem into subproblems, 2. Find upper and lower bounds of each new subproblem, 3. Compare subproblem bounds of all branches, 4. Return to step 1 with the most promising subproblem.

