闲的无聊看到这样的一个游戏就写了一下
一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。
package com.bahe;
import java.util.*;
public class BaHe {
public static int TOTAL = 0;
public static int[] arrayAll;
public static int[] a;
public static int Q = 0;
public static void main(String args[]) {
Scanner inputNum = new Scanner(System.in);
int num = inputNum.nextInt();
int r = (int) (num / 2);
int[] list = new int[num];
for (int i = 0; i < num; i++) {
list[i] = num - i;
}
a = new int[num];
for (int i = 0; i < num; i++) {
a[i] = inputNum.nextInt();
}
InintialArray(num, (int) (num / 2));
Combination(list, r, 0, num);
Print();
}
static void Combination(int[] list, int r, int low, int n) {
if (low < r) {
for (int j = low; j < n; j++) {
if ((low > 0 && list[j] < list[low - 1]) || low == 0) {
int temp = list[low];
list[low] = list[j];
list[j] = temp;
Combination(list, r, low + 1, n);
temp = list[low];
list[low] = list[j];
list[j] = temp;
}
}
}
if (low == r) {
int singleSum = 0;
for (int i = 0; i < r; i++) {
singleSum += a[list[i] - 1];
}
arrayAll[Q++] = (CcWeighAll(a) - singleSum) > singleSum ? (CcWeighAll(a)
- singleSum - singleSum)
: 2 * singleSum - CcWeighAll(a);
}
}
//初始化数据
public static void InintialArray(int num, int b) {
int sort = 0, big = 1, little = 1;
for (int i = num + 1 - b; i <= num; i++) {
big *= i;
}
for (int i = 1; i <= b; i++) {
little *= i;
}
sort = big / little;
arrayAll = new int[sort];
}
//打印结果
public static void Print() {
Arrays.sort(arrayAll);
for (int i = 0; i < arrayAll.length; i++) {
if (arrayAll[i] >= 0) {
System.out.println((CcWeighAll(a) - arrayAll[i]) / 2);
System.out.println((CcWeighAll(a) + arrayAll[i]) / 2);
break;
}
}
}
//计算总重量
public static int CcWeighAll(int a[]) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
return sum;
}
}