Approximating covering and packing problems: set cover, vertex cover, independent set, and related problems