最优组合算法
- 算法实现
- 输出结果
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:543120397 我们一起学Java!需求:
1.目标数组 {10,6,5,3,10,2,1,1,6,1,1}
2.要求组合之和不能大于10,且组合最小
算法实现
/**
* @Description: 最优组合算法
* @Author zengwei
* @Date 2020-11-03-18:32
**/
public class TheBestCombineAlgorithm {
public static void main(String[] args){
int[] arr = {10,6,5,3,10,2,1,1,6,1,1};
int max = 10;
int[][] end = getArray(arr,max);
for (int[] ints : end) {
if (ints != null) {
System.out.println(Arrays.toString(ints));
}
}
}
private static int[][] getArray(int[] arr, int max) {
List<Integer> recordIndex = new ArrayList<>();//记录使用过的元素的索引位置
int[][] finalArray = new int[arr.length][];
//1.从左到右遍历所有元素
int arrIndex = 0;//记录二维数组的位置
for (int i=0;i<arr.length;i++){//每循环一次,位置往后移动一次
int currentElement = arr[i];
if(recordIndex.contains(i)){
continue;//如果当前位置被使用了,跳过本次循环,进入下次循环
}
//判断当前元素是否已经大于后者等于10
if(currentElement >= max){
finalArray[arrIndex] = new int[]{currentElement};
//同时将当前索引位置存入到list中
recordIndex.add(i);
}else{
List<Integer> element = new ArrayList<>();
element.add(currentElement);
while(currentElement <max){
//2.除了当前元素外,查找最小元素
int searchMinIndex = bubble(i,arr,recordIndex);
if(searchMinIndex == -1){
break;
}
currentElement += arr[searchMinIndex];
if(currentElement > max){
break;//因为如果相加大于10,说明不需要这个值了
}
//3.拼接到新的int数组中
element.add(arr[searchMinIndex]);
//4.将当前索引位置存入recordIndex中
recordIndex.add(searchMinIndex);
}
//JDK1.8特性 将List对象转为int[]数组
finalArray[arrIndex] = element.stream().mapToInt(j -> j).toArray();
}
arrIndex ++;
}
//4.存入到新的二维数组中
return finalArray;
}
/**
* 冒泡比较,查找最小元素位置
* @param i 查找开始位置
* @param arr 目标数组
* @param recordIndex 存储已经被使用的元素
* @return 返回最小元素索引位置
*/
private static int bubble(int i, int[] arr, List<Integer> recordIndex) {
int min = arr[i];//记录最小元素的值
int index = -1;//记录最小元素位置
for (;i<arr.length;i++){
if(recordIndex.contains(i)){
continue;
}
if(min > arr[i]){//每次都和最小值比较
min = arr[i];
index = i;
}
}
return index;
}
}
输出结果
“C:\Program Files\Java\jdk1.8.0_101\bin\java.exe”
[10]
[6, 1, 1, 1, 1]
[5, 2, 3]
[10]
[6]
Process finished with exit code 0