O problemă NP-hard este o problemă da/nu în care găsirea unei soluții este cel puțin la fel de dificilă ca și găsirea unei soluții pentru cea mai dificilă problemă a cărei soluție poate fi verificată rapid ca fiind adevărată. Unele probleme NP-hard sunt probleme în care o soluție funcțională poate fi verificată rapid (probleme NP), iar altele nu. Problemele NP-hard care sunt, de asemenea, probleme NP se încadrează într-o categorie numită NP-completă.

Un exemplu de problemă care este cel puțin la fel de greu de rezolvat ca orice altă problemă pentru care putem verifica rapid soluțiile, care este, de asemenea, rapid verificabilă (este atât NP-hard, cât și NP):

Un vânzător ambulant dorește să viziteze 100 de orașe cu mașina, începând și terminând călătoria acasă. El are o rezervă limitată de benzină, așa că poate parcurge în total doar 10 000 de kilometri. El vrea să știe dacă poate vizita toate orașele fără să rămână fără benzină.

Oamenii nu știu cum să rezolve această problemă mai repede decât să testeze fiecare răspuns posibil, dar dacă se găsește o soluție care îi permite vânzătorului să facă acest lucru, putem folosi un algoritm pentru a verifica dacă este adevărat. Această problemă mai este cunoscută și sub numele de "Travelling salesman problem".

Un exemplu de problemă care este cel puțin la fel de greu de rezolvat ca orice altă problemă pentru care putem verifica rapid soluțiile, dar care nu poate fi verificată rapid (este NP-hard, dar nu este NP):

dacă cineva începe un program care pur și simplu merge,

while(true){ continuă; }

și nu-l oprește niciodată, va funcționa la nesfârșit?

Nu există nicio modalitate cunoscută de a găsi o soluție la toate problemele de acest tip și nici acest lucru nu poate fi verificat.