50,526
社区成员
发帖
与我相关
我的任务
分享
import java.util.Random;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
public class Test{
public static void main(String[] args){
ArrayList<Integer> values = Tool.getIntegerArray();
int m = 3;//用于设置相加元素的个数
int max = 30;//用于设置相加不超过的数字
ArrayList<ArrayList<Integer>> results = Tool.process(values,m,max);
for(int i = 0 ; i < results.size() ; i ++){
System.out.print(i + 1 + ":");
ArrayList<Integer> result = results.get(i);
for(int j = 0 ; j < result.size() ; j ++ ){
System.out.print(result.get(j) + ((j != result.size() - 1) ? "+" : ""));
}
System.out.println();
}
}
}
class Tool{
public static ArrayList<Integer> getIntegerArray(){
Random random = new Random();
int size = 20 + random.nextInt(60);
ArrayList<Integer> results = new ArrayList<>();
for(int i = 0 ; i < size ; i ++){
results.add(1 + random.nextInt(29));
}
Collections.sort(results);//这里排序为了后续的操作方便
ArrayList<Integer> temps = new ArrayList<>();
for(int i = size - 1 ; i >= 0 ; i --){
temps.add(results.get(i));
}
//采用倒序返回,因为实现目标是为了不大于某个数值m个数的相加.
results = temps;
return results;
}
public static ArrayList<ArrayList<Integer>> process(ArrayList<Integer> values , int count , int total){
assert total >= values.get(0);
ArrayList<ArrayList<Integer>> results = new ArrayList<>();
int currentTotal = 0;
int value = 0;
ArrayList<Integer> result = null;
int time = 0;
while(values.size() > 0){
result = new ArrayList<>();
if(values.size() == 1){
result.add(values.remove(0));
results.add(result);
break;
}
currentTotal = values.remove(0);
result.add(currentTotal);
time = 0;
for(int index = 0 ; index < values.size() ; index ++){
if(currentTotal + values.get(index) > total){
continue;
}
value = values.remove(index);
currentTotal += value;
result.add(value);
time ++;
if(time > count){
break;
}
}
results.add(result);
}
return results;
}
}