delta=sum(a)-sum(b)
交换a[i]和b[j],那么
delta2=sum2(a)-sum2(b)=sum(a)-a[i]+b[j]-(sum(b)-b[j]+a[i])=sum(a)-sum(b)-2(a[i]-b[j])=delta-2(a[i]-b[j])
令x=a[i]-b[j],那么
delta2=delta-2x
若|delta-2x|<delta2,就交换a[i]和b[j],如此循环直到找不到x使|delta-2x|<|delta|
//
// main.m
// 交换数组元素
//
// Created by zmx on 16/1/26.
// Copyright © 2016年 zmx. All rights reserved.
//
#import <Foundation/Foundation.h>
int sum(int a[], int n) {
int s = 0;
for (int i = 0; i < n; i++) {
s += a[i];
}
return s;
}
void balance(int a[], int b[], int n) {
BOOL cycle = YES;
int delta = sum(a, n) - sum(b, n);
while (cycle) {
cycle = NO;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int x = a[i] - b[j];
if (ABS(delta - x * 2) < ABS(delta)) {
cycle = YES;
a[i] = a[i] + b[j];
b[j] = a[i] - b[j];
a[i] = a[i] - b[j];
delta = sum(a, n) - sum(b, n);
}
}
}
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
const int n = 4;
int a[n] = {5, 10, 7, 9};
int b[n] = {13, 4, 7, 5};
balance(a, b, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
for (int i = 0; i < n; i++) {
printf("%d ", b[i]);
}
}
return 0;
}