【算法设计与分析基础】9、工作分配问题
有N个任务需要分配给n个人执行,一个任务对应一个人(意思是说,每个任务只分配给一个人,每个人只分配一个任务),对应任务分配个对应的人需要d[i,j]的薪酬,求最小价格付出
package cn.xf.algorithm.ch03;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
/**
*
* 功能:有N个任务需要分配给n个人执行,一个任务对应一个人(意思是说,每个任务只分配给一个人,每个人只分配一个任务),对应任务分配个对应的人需要d[i,j]的价值,求最小价值
* @author xiaofeng
* @date 2017年5月10日
* @fileName DistributionProblem.java
*
*/
public class DistributionProblem {
/**
* 250 400 350 500
* 400 600 250 300
* 200 400 350 500
* 300 800 250 300
* @return
*/
@Test
public void getSmallValue(){
//获取所有的子排序,那么数据就有按照排序来分配work1...4的方式,求最小的
int prices[][] = {{250, 400, 350, 500},{400, 600, 250, 300},{200, 400, 350, 500},{300, 800, 250, 300}};
//获取全排序,并且遍历全排序
List<Integer> datas = new ArrayList<Integer>();
List<Integer> curSort = new ArrayList<Integer>();
datas.add(1);datas.add(2);datas.add(3);datas.add(4);
List<List<Integer>> resultSort = DistributionProblem.allSort(datas, curSort);
System.out.println(resultSort.size());
for(List<Integer> list : resultSort){
//求全排序的所有价值和
int count = 0;
for(int i = 0; i < list.size(); ++i){
count += prices[i][list.get(i) - 1];
}
System.out.println(list + " ==> " + count);
}
}
public static List<List<Integer>> allSort(List<Integer> datas, List<Integer> curSort){
//获取结果
List<List<Integer>> resultSort = new ArrayList<List<Integer>>();
if(datas.size() == 0){
//在递归到最后一层的时候,吧当前已经组装好的排序序列组合到结果集中
resultSort.add(curSort);
return resultSort;
}
for(int i = 0; i < datas.size(); ++i){
List<Integer> newCurSort = new ArrayList<Integer>();
List<Integer> newDatas = new ArrayList<Integer>();
newDatas.addAll(datas);
newCurSort.addAll(curSort);
newCurSort.add(datas.get(i));
//获取到一个当前集合之后,吧原来的集合的数据清理调
newDatas.remove(datas.get(i));
//递归获取所有后续排序
resultSort.addAll(allSort(newDatas, newCurSort));
}
return resultSort;
}
@Test
public void test1(){
List<Integer> datas = new ArrayList<Integer>();
List<Integer> curSort = new ArrayList<Integer>();
datas.add(1);datas.add(2);datas.add(3);datas.add(4);
List<List<Integer>> resultSort = DistributionProblem.allSort(datas, curSort);
System.out.println(resultSort.size());
for(List<Integer> list : resultSort){
System.out.println(list);
}
}
}
运行结果:


浙公网安备 33010602011771号