有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); } } }
运行结果: