我的思路并不好:将Arraylist 的元素组合全都列出来,计算出最大值。可以解决这个问题,但是网站过不去,就当是学习排列组合了。
代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SumOfK {
@SuppressWarnings({ "unused", "unchecked" })
private static Integer chooseBestSum(int t,int k, List<Integer> ls){
SumOfK sok = new SumOfK();
@SuppressWarnings("rawtypes")
List s= new ArrayList();
int n = ls.size();
boolean flag = false;
@SuppressWarnings("rawtypes")
List resultEnd = new ArrayList();//每种组合的累加和的数组
int[] xuanzhong = new int[n];//辅助数组,1的位置为选中,0为未选中
for(int i = 0; i < k ; i++){//辅助数组的初始化:将前k个元素设为1
xuanzhong[i] = 1;
}
resultEnd.add(sum(CreatResult(ls,xuanzhong,k)));//先添加最初选择
//s.add(sok.CreatResult(ls, xuanzhong, k));
do{
int pose = 0;
int sum = 0;
for(int i = 0; i < (n - 1); i ++){//进行一次10转换
if(xuanzhong[i] == 1 && xuanzhong[ i + 1] == 0){
xuanzhong[i] = 0;
xuanzhong[i + 1] = 1;
pose = i;
break;
}
}
//将pose前边的1都排在最左边
for(int i = 0; i < pose; i ++){
if(xuanzhong[i] == 1){
sum++;
}
}
for(int i = 0 ; i < pose; i ++){
if( i < sum){
xuanzhong[i] = 1;
}else{
xuanzhong[i] = 0;
}
}
int[] result1 = CreatResult(ls, xuanzhong, k);
resultEnd.add(sum(result1));
flag = false;
for(int i = n - k; i < n; i ++){
if(xuanzhong[i] == 0){
flag = true;
}
}
}while(flag);
for(int i = 0; i < resultEnd.size(); i ++){
System.out.println(resultEnd.get(i));
}
Collections.sort(resultEnd);
int index = 0;
for(int i = 0 ;i < resultEnd.size(); i++){
if((int)resultEnd.get(i) <= t){
index = i;
}
}
if(index == 0){
return null;
}
if(ls.size() < k){
return null;
}
t = (int)resultEnd.get(index);
return t;
}
//生成选中组合
private static int[] CreatResult(List<Integer> ls,int[] xuanzhong,int m){
int[] result = new int[m];
int j = 0;
for(int i = 0; i < ls.size(); i ++){
if(xuanzhong[i] == 1){
result[j] = ls.get(i);
j++;
}
}
return result;
}
//计算总的大小
private static int sum(int[] result){
int sum = 0;
int length = result.length;
for(int i = 0; i < length; i ++){
sum += result[i];
}
return sum;
}
public static void main(String[] args){
List<Integer> ts = new ArrayList<>(Arrays.asList(50,55,56,57,58));
System.out.println(chooseBestSum(163,3,ts));
}
}