按部就班式代码 黑板上的排列组合 你舍得解开吗 \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; } } }