Probabilistic construction of deterministic algorithms: approximating packing integer programs