This document discusses NP-completeness and algorithms. It begins by reviewing tractable versus intractable problems, and the complexity classes P and NP. P contains problems solvable in polynomial time, while NP includes problems verifiable in polynomial time. The document then discusses NP-complete problems, which are the hardest problems in NP. It notes that reducing one problem to another shows the first problem is no harder than the second. The document concludes by outlining the steps to prove a problem is NP-complete: choosing a known NP-complete problem, reducing it to the target problem in polynomial time, and showing the target is in NP.