Problem solving is an essential part of every scientific discipline. It has two (1) problem identification and formulation, and (2) solution of the formulated problem. One can solve a problem on its own using ad hoc techniques or follow those techniques that have produced efficient solutions to similar problems. This requires the understanding of various algorithm design techniques, how and when to use them to formulate solutions and the context appropriate for each of them. This book advocates the study of algorithm design techniques by presenting most of the useful algorithm design techniques and illustrating them through numerous examples.
This book does not explain each algorithm that the exercises/questions are asking you to develop. This was very frustrating while taking an undergraduate Algorithms course. Nonetheless, the author, of whom is a very smart Middle Easterner, does a great job of explaining the ones that he has deemed important. He is very well-educated. The last few chapters are incredibly difficult to grasp, starting with chapter 10, NP-complete problems. This is because I had never understood it anyway; however, after reading through the chapter multiple times and seeking secondary sources, I have finally grasped it. A tip: if you can do the exercises, you understand what the author is not saying; the exercises require a lot of creativity and innovation.