zoukankan      html  css  js  c++  java
  • 【算法设计与分析基础】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);
    		}
    	}
    	
    }
    

      

    运行结果:

  • 相关阅读:
    java 数字补齐0
    Ubuntu 12.04中文输入法的安装
    mac 更改word的默认显示比例为125
    接口测试的简介
    接口测试和功能测试的区别
    session、token、cookie的区别
    python接口自动化--get请求
    测试用例之正交排列法
    编写测试用例的方法
    jquery选择器
  • 原文地址:https://www.cnblogs.com/cutter-point/p/6860118.html
Copyright © 2011-2022 走看看