【算法设计与分析基础】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);
		}
	}
	
}

  

 

运行结果:

 

posted @ 2017-05-16 10:32  cutter_point  阅读(755)  评论(0)    收藏  举报