【发布时间】:2015-09-22 06:02:39
【问题描述】:
如何编写一个 Java 程序将一组数字分成两组,以使它们各自数字之和的差最小。
例如,我有一个包含整数的数组 - [5,4,8,2]。我可以把它分成两个数组——[8,2] 和 [5,4]。假设给定的一组数字,可以有一个唯一的解决方案,就像上面的例子一样,如何编写一个Java程序来实现这个解决方案。即使我能够找出最小可能的差异,那也很好。 假设我的方法接收一个数组作为参数。该方法必须首先将接收到的数组分成两个数组,然后将其中包含的整数相加。此后,它必须返回它们之间的差异,使差异尽可能小。
P.S.- 我已经环顾四周,但找不到任何具体的解决方案。这里似乎给出了最可能的解决方案-divide an array into two sets with minimal difference。但我无法从该线程中收集到如何编写 Java 程序来获得问题的明确解决方案。
编辑:
看了@Alexandru Severin 的评论后,我尝试了一个java程序。它适用于一组数字 [1,3,5,9],但不适用于另一组 [4,3,5,9,11]。下面是程序。请提出更改建议:-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FindMinimumDifference {
public static void main(String[] args) {
int[] arr= new int[]{4,3,5,9, 11};
FindMinimumDifference obj= new FindMinimumDifference();
obj.returnMinDiff(arr);
}
private int returnMinDiff(int[] array){
int diff=-1;
Arrays.sort(array);
List<Integer> list1= new ArrayList<>();
List<Integer> list2= new ArrayList<>();
int sumOfList1=0;
int sumOfList2=0;
for(int a:array){
for(Integer i:list1){
sumOfList1+=i;
}
for(Integer i:list2){
sumOfList2+=i;
}
if(sumOfList1<=sumOfList2){
list1.add(a);
}else{
list2.add(a);
}
}
List<Integer> list3=new ArrayList<>(list1);
List<Integer> list4= new ArrayList<>(list2);
Map<Integer, List<Integer>> mapOfProbables= new HashMap<Integer, List<Integer>>();
int probableValueCount=0;
for(int i=0; i<list1.size();i++){
for(int j=0; j<list2.size();j++){
if(abs(list1.get(i)-list2.get(j))<
abs(getSumOfEntries(list1)-getSumOfEntries(list2))){
List<Integer> list= new ArrayList<>();
list.add(list1.get(i));
list.add(list2.get(j));
mapOfProbables.put(probableValueCount++, list);
}
}
}
int minimumDiff=abs(getSumOfEntries(list1)-getSumOfEntries(list2));
List resultList= new ArrayList<>();
for(List probableList:mapOfProbables.values()){
list3.remove(probableList.get(0));
list4.remove(probableList.get(1));
list3.add((Integer)probableList.get(1));
list4.add((Integer)probableList.get(0));
if(minimumDiff>abs(getSumOfEntries(list3)-getSumOfEntries(list4))){
// valid exchange
minimumDiff=abs(getSumOfEntries(list3)-getSumOfEntries(list4));
resultList=probableList;
}
}
System.out.println(minimumDiff);
if(resultList.size()>0){
list1.remove(resultList.get(0));
list2.remove(resultList.get(1));
list1.add((Integer)resultList.get(1));
list2.add((Integer)resultList.get(0));
}
System.out.println(list1+""+list2); // the two resulting set of
// numbers with modified data giving expected result
return minimumDiff;
}
private static int getSumOfEntries(List<Integer> list){
int sum=0;
for(Integer i:list){
sum+=i;
}
return sum;
}
private static int abs(int i){
if(i<=0)
i=-i;
return i;
}
}
【问题讨论】:
-
@LuigiCortese:我试图首先对数组进行排序。然后开始将一个数字放入一组,另一个数字放入另一组,依此类推,直到结束。但它似乎没有用。