This document discusses NP-completeness and NP-hard problems. It begins by reviewing P vs NP problem classes and introduces the concepts of NP-hard and NP-complete problems. It provides examples of well-known NP-complete problems and discusses techniques for proving that a problem is NP-complete, such as reducing it to the SAT, CLIQUE, or vertex cover problems. The document aims to define key complexity classes like P, NP, NP-hard and NP-complete and explain the relationships between them.