best travel,

我的思路并不好:将Arraylist 的元素组合全都列出来,计算出最大值。可以解决这个问题,但是网站过不去best travel,,就当是学习排列组合了。

代码如下:

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));
}
}

相关文章:

  • 2021-06-04
  • 2021-10-01
  • 2021-08-23
  • 2021-09-14
  • 2021-05-15
  • 2021-09-17
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-29
  • 2021-12-02
  • 2021-05-21
  • 2021-11-03
  • 2021-08-24
  • 2021-06-04
相关资源
相似解决方案