package algorithm;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.TreeMap;
/**
*
* @Description: n个数按顺序分成m组,每组和尽量相近
* 思路:先递归求出所有切分点的组合方式,然后分别计算每组中的和,对每组和两两差值的绝对值累加,最小的为最优切分点。
* 如:{1,2,3,4}分2组 可以{1}和{2,3,4} {1,2}和{3,4} {1,2,3}和{4} 不能为{1,3}{2,4}
* 缺点:当list很大,分的组很多的时候,效率很低,几十分钟才能算出来。
* @author thrillerzw
* @version 1.0
* @create time 2014-4-28 下午6:47:19
*/
public class TestCombination {
public static void main(String[] args) {
List<Integer> lengthList = new ArrayList<Integer>();
for(int i=0;i<6;i++){
lengthList.add(new Random().nextInt(100));
}
long startTime=System.currentTimeMillis();
int m = 3;
List<List<Integer>> resultList = new ArrayList<List<Integer>>();
if (lengthList.size() < m) {
buildResultList(resultList, lengthList);
} else {
int endIndex = lengthList.size() - (m - 2);
int[] tempArr = new int[m - 1];
List<int[]> combList = new ArrayList<int[]>();
int num = -1;
//所有切分点的组合存入combList
Combine(lengthList, m - 1, tempArr, 0, 0, combList);
int[] resultArr = null;
for (int[] combArr : combList) {
for (int i = 0; i < combArr.length; i++) {
System.out.print(combArr[i] + " ");
}
System.out.println();
int[] sumArr = getSum(combArr, lengthList);
int diffSum = compu
算法n个数按顺序分成m组,每组和尽量相近
最新推荐文章于 2022-11-27 18:28:56 发布