Java一組資料,滿足數量和求和的最優解
阿新 • • 發佈:2018-11-26
記錄一下,方便以後使用:
有一件物品是240元,需要所有人一起湊錢購買,求最優解:
1、第一優先的是人數,湊夠錢買物品的人的組合裡,人數最少的
2、第二優先的是價格,要求超過240,但是離240最接近的一組,因為從大到小排列一定能得到人數最少的,但是可能會比目標數額大很多,導致找零太多
最後要求返回滿足上面兩個條件的最優解,也就是這個組合裡的所有元素
public class Test {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
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[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