Combinatorial Problems: Reductibility and Approximation