65,186
社区成员




// 将序列对折拆分入两组:ga、gb,gd中保存组差sum(gb)-sum(ga)
int gl=??; // gl中保存组长度
int flag;
do
{
flag=0;
for (int i=0;i<gl;i++) // 寻找交换后能缩减两组差额绝对值的数对
{
for (int j=0;j<gl;j++)
{
if (abs(ga[i]-gb[j]+gd)<abs(gd))
{
// 交换ga[i]、gb[j]
flag=1;
gd=gb[j]-ga[i]+gd;
goto next;
}
}
}
next:
}while(flag); // 若没有发生交换事件,则已找到最佳拆分
// 首先还是逆序排序
int cc=序列长度;
int ds=0; // 记录b组和与a组和的差额
int al=0,bl=0; // 记录a组及b组的长度
for (int i=0;i<序列长度;i++)
{
if (ds>0)
{
// a组更小,将当前数加入a组
if (++al>=cc/2)
break;
}
else
{
// b组更小,将当前数加入b组
if (++bl>=cc/2)
break;
}
}
for (;i<序列长度;i++) // 若还有剩余数字,则加入未满组
if (al<cc/2)
{
// 将当前数添加入a组
al++;
}
else
{
// 将当前数添加入b组
}
public static void main (String arg[]) {
int a[] = { 2, 3, 6 ,9};
int sum1 = 0, sum2 = 0;
int tmp = 0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if (a[i] > a[j]) {
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
for (int i = 0; i < a.length; i++) {
if (sum1 < sum2) {
sum1 += a[i];
} else {
sum2 += a[i];
}
}
System.out.println(Math.abs(sum1 - sum2));
}