Java一组数据,满足数量和求和的最优解

记录一下,方便以后使用:

有一件物品是240元,需要所有人一起凑钱购买,求最优解:
1、第一优先的是人数,凑够钱买物品的人的组合里,人数最少的
2、第二优先的是价格,要求超过240,但是离240最接近的一组,因为从大到小排列一定能得到人数最少的,但是可能会比目标数额大很多,导致找零太多

最后要求返回满足上面两个条件的最优解,也就是这个组合里的所有元素


import java.util.Arrays;

public class Test {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
final int NUMBER = 150;
   int[] a = new int[NUMBER];
   for (int i = 0; i < NUMBER; i++) a[i] = i+1;
//int a[] = {80,60,55,50,45,40,30,20,15};
Arrays.sort(a);
//倒叙排序
for (int start=0, end=a.length-1; start<end; start++,end--) {
       int temp = a[end];
       a[end] = a[start];
       a[start] = temp;
   }
int target = NUMBER * 10;
int minNum = 0; 
int sum = 0;
for(int i=0;i<a.length;i++){
if(sum >= target){
break;
}else{
sum = sum + a[i];
minNum++;
}
}
//首先获取最大个数
System.out.println(minNum);
String items = "";
int targetSum = sum;
//取出数组下任意元素组合下标
for(int i=0;i<=(a.length-minNum+1);i++){
for(int j=0;j<a.length-minNum;j++){
String flag = "";
int maxIndex = 0;
int total = 0;
for(int k=0;k<minNum;k++){
if((k+1) == minNum){
maxIndex = k+j+i;
if(maxIndex >= a.length){
break;
}
flag = flag + a[(k+j+i)]+",";
total = total + a[(k+j+i)];
}else{
flag = flag + a[(k+i)]+",";
total = total + a[(k+i)];
}
}
if(maxIndex >= a.length){
break;
}
if(total >= target && total < targetSum){
targetSum = total;
items = flag;
}
}
}
long usedTime = System.currentTimeMillis() - startTime;
System.out.println(items + "=====" + targetSum + " 时间:" + usedTime);
}

}

打印:

11

150,149,148,147,146,145,144,143,142,141,45,=====1500 时间:45


猜你喜欢

转载自blog.csdn.net/a718089112/article/details/80090045