The tourist trip design problem is an extension of the orienteering problem applied to tourism. The problem consists in selecting a subset of locations to visit from among a larger set while maximizing the benefit for the tourist. The benefit is given by the sum of the rewards collected at each location visited. We consider a variant of the problem that deals not only with "typical" constraints such as budget, opening-time hours (i.e., time windows at the locations), and maximum trip duration but also with other practical tourism constraints such as mandatory visits, limits on the number of locations of each type, and the order at which selected locations are visited. To solve this problem, we propose a branch-and-check approach in which the master problem selects a subset of locations, verifying all except time-related constraints, and these locations define candidate solutions to the master problem. For each candidate solution, the slave problem checks whether a feasible trip can be built using the given locations. To accelerate the branch-and-check approach, we propose and test improvements , including preprocessing to tighten the master-slave problem, valid inequalities generated dynamically to strengthen the master problem, and a local branching and variable neighborhood search to find new feasible solutions. Finally, we report the experimental results and compare the performance of the proposed exact algorithm with that of a mathematical solver.