1.拔河规则:
将一拨人分为两组进行拔河比赛,条件是两队分配的人的个数相差不能超过1个(即小于等于1),且两队的总体重的差值是最小的。
通过穷举法来实现示例如下:
Test.java
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int sum = scanner.nextInt();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < sum; i++) {
list.add(scanner.nextInt());
}
int cont = list.size() / 2;
sum = 0;
for (Integer integer : list) {
sum += integer;
}
sum /= 2;
ArrayList<Integer> first = new ArrayList<>();
int func = func(list, cont, sum, first);
System.out.println(func);
System.out.println(first);
for (Integer integer : first) {
list.remove(integer);
}
System.out.println(list);
}
public static int func(List<Integer> list, int cont, int sum, List<Integer> first) {
if (first.size() == cont) {
int first_sum = 0;
for (Integer integer : first) {
first_sum += integer;
}
return Math.abs(first_sum - sum);
} else {
int min = Integer.MAX_VALUE;
List<Integer> minFirst = null;
for (int i = 0; i < list.size(); i++) {
ArrayList<Integer> temp = new ArrayList<>(list);
ArrayList<Integer> f = new ArrayList<>(first);
f.add(temp.remove(i));
int func = func(temp, cont, sum, f);
if (func < min) {
min = func;
minFirst = f;
}
}
first.clear();
first.addAll(minFirst);
return min;
}
}
}