This document discusses NP completeness and proving problems are NP-complete. It begins by reviewing tractable and intractable problems, and the classes P and NP. It then discusses NP-complete problems, specifically that they are problems whose status as being solvable in polynomial time is unknown. The document outlines that to prove a problem P is NP-complete, one must reduce a known NP-complete problem Q to P in polynomial time, showing P is at least as hard as Q. This establishes P as NP-hard, and if P is also in NP, then it is NP-complete.