按部就班式代码 黑板上的排列组合 你舍得解开吗 \doge
import java.util.*;
public class Main {
static List<int[]> indexesList = new ArrayList<>();
static LinkedList<Integer> STACK = new LinkedList<>();
static int[] INDEXES;
static int SUM = 0;
static int[] ARRAY;
static boolean SUCCESS = false;
static int THREE = 0;
static int FIVE = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
init(in.nextInt(), in);
if ((SUM & 1) == 1) {
System.out.println(SUCCESS);
return;
}
traverse();
System.out.println(SUCCESS);
}
static void traverse() {
for (int i = 1; i <= ARRAY.length; i++) {
combine(INDEXES, i, 0, 0);
}
}
static boolean isLegalStack() {
int t = 0, f = 0;
for (int i = 0; i < STACK.size(); i++) {
int v = ARRAY[STACK.get(i)];
if (v % 3 == 0) {
t++;
}
if (v % 5 == 0) {
f++;
}
}
return (t == 0 && f == FIVE) || (t == THREE && f == 0) || (t == 0 && f == 0);
}
static int sum() {
int s = 0;
for (int i = 0; i < STACK.size(); i++) {
s += ARRAY[STACK.get(i)];
}
return s;
}
static void combine(int[] a, int target, int count, int index) {
if (SUCCESS) {
return;
}
if (target == count) {
if (sum() << 1 == SUM && isLegalStack()) {
SUCCESS = true;
}
return;
}
for (int i = index; i < a.length; i++) {
if (!STACK.contains(a[i])) {
STACK.push(a[i]);
combine(a, target, count + 1, i);
STACK.pop();
}
}
}
static void init(int n, Scanner sc) {
ARRAY = new int[n];
INDEXES = new int[n];
for (int i = 0; i < ARRAY.length; i++) {
ARRAY[i] = sc.nextInt();
SUM += ARRAY[i];
if (ARRAY[i] % 3 == 0) {
THREE++;
}
if (ARRAY[i] % 5 == 0) {
FIVE++;
}
INDEXES[i] = i;
}
}
}

京公网安备 11010502036488号