あなたがリストしたのはまさにパーティションの問題です(詳細についてはhttp://en.wikipedia.org/wiki/Partition_problemをご覧ください)。要点は、これは NP 完全問題であるため、この問題のインスタンス (つまり、より大きな数) を解決できるプログラムは存在しないということです。
しかし、問題が常に 10 個の数字だけで、それぞれが正確に 5 個の項目からなる 2 つのリストに分割される場合、考えられるすべての解を素朴に試すことも可能になります。 N=10 は整数の数であるため、組み合わせは 2^10=1024 しかなく、それぞれの検証には O(N) しかかかりません (つまり、差を計算します)。
それ以外の場合は、ウィキペディアのページで説明されている貪欲なアルゴリズムを実装できます。実装は簡単ですが、最適性の保証はありません。実際、Java でこの実装を確認できます。
static void partition() {
int[] set = {10, 29, 59, 39, 20, 17, 29, 48, 33, 45}; // array of data
Arrays.sort(set); // sort data in descending order
ArrayList<Integer> A = new ArrayList<Integer>(5); //first list
ArrayList<Integer> B = new ArrayList<Integer>(5); //second list
String stringA=new String(); //only to print result
String stringB=new String(); //only to print result
int sumA = 0; //sum of items in A
int sumB = 0; //sum of items in B
for (int i : set) {
if (sumA <= sumB) {
A.add(i); //add item to first list
sumA+=i; //update sum of first list
stringA+=" "+i;
} else {
B.add(i); //add item to second list
sumB+=i; //update sum of second list
stringB+=" "+i;
}
}
System.out.println("First list:" + stringA + " = " + sumA);
System.out.println("Second list:"+ stringB+ " = " + sumB);
System.out.println("Difference (first-second):" + (sumA-sumB));
}
良い結果が返されません:
First list: 10 20 29 39 48 = 146
Second list: 17 29 33 45 59 = 183
Difference (first-second):-37