1. 程式人生 > >Java一組資料,滿足數量和求和的最優解

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