1. A method of distributing applications between a plurality of machines forming a client system, the method comprising: determining that applications should be distributed to optimize hardware utilization of each or the plurality of machines; determining all possible configurations of applications among the plurality of machines; creating a list of all possible configurations; comparing the list of all possible configurations to a database of state information; removing configurations from the list if the configuration is the same as a state previously determined to be non-functional to create a pruned list; generating a score for each configuration on the pruned list by comparing each configuration with states information in the database; selecting the configurations with the highest score, the number of configurations equaling the number of machines; and deploying the selected configurations on the plurality of machines.