アルゴリズムnの数は順番にmグループに分けられ、各グループとできるだけ近いです.


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 lengthList = new ArrayList();
		for(int i=0;i<6;i++){
			lengthList.add(new Random().nextInt(100));
		}
		long startTime=System.currentTimeMillis();
		int m = 3;
		List> resultList = new ArrayList>();
		if (lengthList.size() < m) {
			buildResultList(resultList, lengthList);
		} else {
			int endIndex = lengthList.size() - (m - 2);
			int[] tempArr = new int[m - 1];
			List combList = new ArrayList();
			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 = computeDifferent(sumArr);
				if (diffSum < num || num == -1) {
					num = diffSum;
					System.out.println("num=" + num);
					resultArr = combArr;
				}
			}
			if (resultArr != null) {
				for (int result : resultArr) {
					System.out.print(result + " ");
				}
			}

			buildResultList(resultList, lengthList, resultArr);
		}
		long endTime=System.currentTimeMillis();
		long useTime=endTime-startTime;
		System.out.print(lengthList.size()+"    "+m+"       "+useTime+" resultList=" + resultList);
	}
    //     m         。
	static void buildResultList(List> resultList,
			List dataList) {
		for (int i = 0; i < dataList.size(); i++) {
			List list = new ArrayList();
			list.add(dataList.get(i));
			resultList.add(list);
		}
	}

	//             
	static void buildResultList(List> resultList,
			List dataList, int[] resultArr) {
		if (resultList == null || dataList == null || resultArr == null) {
			return;
		}
		int j = 0;
		int maxJ = 0;
		for (int i = 0; i <= resultArr.length; i++) {
			if (i == resultArr.length) {
				maxJ = dataList.size();
			} else {
				maxJ = resultArr[i];
			}
			List list = new ArrayList();
			for (; j < maxJ; j++) {
				list.add(dataList.get(j));
			}
			resultList.add(list);
		}
	}
    //         。  0--2  2--5   5--list   
	static int[] getSum(int[] combArr, List dataList) {
		if (combArr == null || dataList == null) {
			return null;
		}
		int[] sumArr = new int[combArr.length + 1];
		int j = 0;
		int sum = 0;
		int maxJ = 0;
		for (int i = 0; i <= combArr.length; i++) {

			if (i == combArr.length) {
				maxJ = dataList.size();
			} else {
				maxJ = combArr[i];
			}
			for (; j < maxJ; j++) {
				sum += dataList.get(j);
			}
			sumArr[i] = sum;
			System.out.println("sum=" + sum);
			sum = 0;
		}
		return sumArr;
	}

	//         ,         
	static int computeDifferent(int[] sumArr) {
		int diffSum = 0;
		for (int i = 0; i < sumArr.length; i++) {
			for (int j = i + 1; j < sumArr.length; j++) {
				diffSum += Math.abs(sumArr[i] - sumArr[j]);
			}
		}
		System.out.println("diffSum=" + diffSum);
		return diffSum;
	}

	//        
	private static void Combine(List lengthList, int num,
			int[] tempArr, int tempArrIndex, int low, List combList) {
		if (lengthList == null || lengthList.size() < num) {
			return;
		}
		if (num == 0) {
			if (tempArr[tempArr.length - 1] != lengthList.size()) {
				combList.add(tempArr);
			}
		} else {
			for (int i = low; i < lengthList.size(); i++) {
				tempArr[tempArrIndex] = i + 1;
				Combine(lengthList, num - 1, tempArr, ++tempArrIndex, i + 1,
						combList);
				int[] newTempArr = new int[tempArr.length];
				System.arraycopy(tempArr, 0, newTempArr, 0, tempArr.length - 1);
				tempArr = newTempArr;
				tempArrIndex--;
			}
		}
	}

}
 
2、
package algorithm;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @Description:      ,             。
 *   :    、     ,            。           。
 *   :                  。
 * @author thrillerzw
 * @version 1.0
 * @create time 2014-4-30   9:52:16
 */
public class TestAverage {
	public static void main(String[] args) {
		List lengthList = new ArrayList();
		lengthList.add(1);
		lengthList.add(2);
		lengthList.add(8);
		lengthList.add(6);
		lengthList.add(4);
		lengthList.add(10);
	
		int m = 3;
		List> resultList = new ArrayList>();
		if (lengthList.size() < m) {
			buildResultList(resultList, lengthList);
		} else {
			int[] pointArr = findSplitPoint(lengthList, m);
			buildResultList(resultList, lengthList, pointArr);
		}
		System.out.print("resultList=" + resultList);
	}

	private static int[] findSplitPoint(List lengthList, int m) {
		int totalNum = 0;
		for (int i = 0; i < lengthList.size(); i++) {
			totalNum += lengthList.get(i);
		}
		//   
		double average = (double) totalNum / (double) m;
		System.out.println("average=" + average);
		int groupNum = 0;
		int[] pointArr = new int[m - 1];
		int pointArrIndex = 0;
		double minDiffSum = -1;
		int i = 0;
		for (; i < lengthList.size(); i++) {
			int num = lengthList.get(i);
			//     
			groupNum += num;
			double curDiffSum = Math.abs(groupNum - average);

			int surplusGroupNum = m - 1 - pointArrIndex;
			int surplusDataNum = lengthList.size() - i;
			int differNum = surplusDataNum - surplusGroupNum;
            
			if (differNum > 0) {
				//             <              
				if (curDiffSum < minDiffSum || minDiffSum == -1) {
					minDiffSum = curDiffSum;
				} else {
					//     
					pointArr[pointArrIndex] = i;
					if (pointArrIndex == m - 2) {
						break;
					}
					pointArrIndex++;
					groupNum = num;
					minDiffSum = Math.abs(num - average);
				}
			} else {
				//           ,       。             。
				pointArr[pointArrIndex++] = i;
				int point = i + 1;
				for (int j = 0; j < surplusGroupNum - 1; j++) {
					pointArr[pointArrIndex++] = point++;
				}
				break;
			}

		}
		return pointArr;
	}

	static void buildResultList(List> resultList, List dataList) {
		for (int i = 0; i < dataList.size(); i++) {
			List list = new ArrayList();
			list.add(dataList.get(i));
			resultList.add(list);
		}
	}

	static void buildResultList(List> resultList, List dataList, int[] resultArr) {
		if (resultList == null || dataList == null || resultArr == null) {
			return;
		}
		int j = 0;
		int maxJ = 0;
		for (int i = 0; i <= resultArr.length; i++) {
			if (i == resultArr.length) {
				maxJ = dataList.size();
			} else {
				maxJ = resultArr[i];
			}
			List list = new ArrayList();
			for (; j < maxJ; j++) {
				list.add(dataList.get(j));
			}
			resultList.add(list);
		}
	}

}