将一个整数任意分成n个整数之和并且整数有最小值和最大值限制
日志是为了分析,每个步骤执行的结果。
/**
* 将一个整数分割成n个整数之和,且每个整数大于等于min && 小于等于max
*
* @param sum 分割的总数量
* @param size 需要分割多少份
* @param min 每份最少多少个
* @param max 每份最多少个
* @return 数组元素之和是sum
*/
private static int[] getRandomArray(int sum, int size, int min, int max) {
int[] result = new int[size];
int count = size - 1;
Arrays.fill(result, min);
int free = sum - size * min;
int totalMaxNumber = 0;
Random random = new Random();
while (free > 0 && count > 0) {
int newX = count;
// int newX = --x;
if (totalMaxNumber >= size - 1) {
boolean isBreak = false;
int maxCount = 0;
for (int i = 0; i < result.length; i++) {
if (result[i] == max) {
maxCount++;
log.info("1 " + JSON.toJSONString(result) + "====" + free);
} else {
if ((result[i] + free) <= max) {
result[i] += free;
isBreak = true;
free = 0;
log.info("2 " + JSON.toJSONString(result) + "====" + free);
break;
} else {
maxCount++;
free = free - (max - result[i]);
result[i] = max;
log.info("3 " + JSON.toJSONString(result) + "====" + free);
}
}
}
if (isBreak || maxCount >= 4) {
log.info("4 " + JSON.toJSONString(result) + "====" + free);
break;
}
}
if (count == 1) {
if ((free + result[newX]) <= max) {
result[newX] += free;
log.info("5 " + JSON.toJSONString(result) + "====" + free);
break;
} else {
free = free - (max - result[newX]);
result[newX] = max;
count = size - 1;
log.info("6 " + JSON.toJSONString(result) + "====" + free);
}
} else {
if (result[newX] == max) {
totalMaxNumber++;
log.info("7 " + JSON.toJSONString(result) + "====" + free);
} else {
int y = random.nextInt(free);
log.info("7.5 " + JSON.toJSONString(result) + "====" + free + "==++++++++++++==" + y + "------" + newX);
if ((result[newX] + free) <= max) {
result[newX] += free;
log.info("8 " + JSON.toJSONString(result) + "====" + free + "==++++++++++++==" + y);
break;
}
if (result[newX] >= max) {
y = 0;
log.info("9 " + JSON.toJSONString(result) + "====" + free + "==++++++++++++==" + y);
} else if ((y - result[newX]) >= max) {
y = max - result[newX];
log.info("10 " + JSON.toJSONString(result) + "====" + free + "==++++++++++++==" + y);
} else if ((y + result[newX]) >= max) {
y = max - result[newX];
log.info("11 " + JSON.toJSONString(result) + "====" + free + "==++++++++++++==" + y);
}
result[newX] += y;
free -= y;
log.info("12 " + JSON.toJSONString(result) + "====" + free + "==++++++++++++==" + y);
}
count--;
}
}
return result;
}
public static void main(String[] args) {
int[] randomArray = getRandomArray(2300, 4, 60, 600);
int[] randomArray1 = getRandomArray(1800, 3, 60, 600);
int[] randomArray2 = getRandomArray(1800, 6, 60, 600);
System.out.println("结果"+ JSON.toJSONString(randomArray) + "----" +JSON.toJSONString(randomArray1) +
"----" +JSON.toJSONString(randomArray2));
}