User cooperation is a powerful solution that can significantly improve the reliability of wireless networks by using several relays to achieve diversity gains. There has been a lot of work on improving the peer-to-peer link quality of a single source-destination pair. However, how to fairly and efficiently allocate resources among multiple nodes has not received much attention yet. In this paper, we propose a novel cooperative diversity method that can achieve fair and efficient resource allocation. We shall show that fairness cannot be achieved by using fixed sets of relays in general. A multi-state cooperation method, where the relay set of each node can be changed, is then proposed to solve this problem. In this proposed approach, the energy is allocated among the nodes via a finite step iterative algorithm. In each step, the relay sets of nodes are changed so that each step will generate a cooperation state, which characterizes the cooperation relationship among the nodes. Based on the energy allocation result, the duration of each state is then optimized so as to minimize the outage probability. We shall show that the proposed method can not only guarantee fairness, but also provide significant diversity gain over conventional cooperation schemes.