NP vs NP Complete vs NP Hard
From VersusWiki
NP is the set of all decision problems for which the correct solution (once it is known) can be verified in polynomial time by a deterministic Turing machine. The correct solution for NP problems can be found in polynomial time by a non-deterministic Turing machine. The solution may or may not be able to be found in polynomial time by a deterministic Turing machine (that is the most important unsolved computer science problems, it is called the P=NP problem).
NP-Complete is a subset of NP. For the set of NP-Complete problems, if one of them can be solved in polynomial time by a deterministic Turing machine (which is currently unknown) then all NP problems can be solved in polynomial time by a deterministic Turing machine. This is because the definition of NP-Complete is the of set NP problems for which all other NP problems can be transformed into (reduced to) in polynomial time. So if any NP-Complete problem can be solved in polynomial time then any other NP problem can be solved in polynomial time by transforming it to the NP-Complete problem (which must by definition take polynomial time) and then solving the NP-Complete problem.
NP-Hard is the set of all problems that are at least as hard as the NP problems, or put another way, the problems in NP are no harder than the NP-Hard problems. A problem is NP-Hard if an NP problem can be reduced to it (by a deterministic Turing machine in polynomial time). In other words a problem is NP-Hard if there is an NP problem that can be solved by solving the NP-Hard problem.
