package number;
/**
* @author ycsun E-mail:stevesun521@gmail.com
* @version 创建时间:2012-10-3 下午2:59:49 类说明
*/
public class ArrayOperation {
private int[] arr;
private int[] aux;
private int groupid = 0;
public ArrayOperation(int[] arr) {
this.arr = arr;
aux = new int[arr.length];
}
/**
* @param int[] arr 一个整数组,长度为 n,将其分为 m 份,使各的和相等求 m 的最大值,比如{3,2,4,3,6}
* 可以分成{3,2,4,3,6,} m=1;{3,6}{2,4,3}m=2 {3,3}{2,4}{6} m=3 所以m的最大值是3
*/
public int averageSplitArray() {
if (arr.length == 1) {
return 1;
}
int res = 1;
int sum = 0;
for (int i = 0; i < arr.length; i++)
sum += arr[i];
for (int i = 1; i < arr.length; i++) {
if (sum % i != 0)
continue;
groupid = 0;
for (int j = 0; j < arr.length; j++)
aux[j] = 0;
averageSplitArray(i,sum / i,sum/i);
int gnum = i;
if (gnum > 0) {
System.out.println("gnum :" + gnum);
for (int g = 1; g <= i; g++) {
System.out.print("{");
for (int k = 0; k < aux.length; k++) {
if (aux[k] == g) {
System.out.print(arr[k] + ",");
}
}
System.out.println("}");
}
}
}
return res;
}
private boolean averageSplitArray(int groupnum,int groupsum,int goalsum) {
if (goalsum == 0) {
groupid++;
goalsum=groupsum;
if (groupid == groupnum + 1)
return true;
}
for (int i = 0; i < aux.length; i++) {
if (aux[i] != 0)
continue;
aux[i] = groupid;
if(averageSplitArray(groupnum,groupsum,goalsum-arr[i])) return true;
aux[i]=0;
}
return false;
}
public static void main(String[] args) {
int[] arr = { 3, 2, 4, 3, 6 };
ArrayOperation ao = new ArrayOperation(arr);
ao.averageSplitArray();
}
}
一个整数组,长度为 n,将其分为 m 份,使各的和相等求 m 的最大值,比如{3,2,4,3,6} 可以分成{3,2,4,3,6,} m=1;{3,6}{2,4,3}m=2 {3,3}{2,4}{6}
最新推荐文章于 2022-07-13 23:07:00 发布