匈牙利算法
小技巧:偶数与偶数、奇数与奇数的和一定为一个偶数,即能被2整除,肯定不为素数。因此素数只能由奇数加偶数组成。
将奇数、偶数分为两列,寻找素数伴侣即是转化为寻找二部图増广路径。

import java.util.*;
public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
            }
            ArrayList<Integer> evens = new ArrayList();
            ArrayList<Integer> adds = new ArrayList();

            for (int i = 0; i < n; i++) {
                if ((arr[i] & 1) == 1) {
                    evens.add(arr[i]);
                } else {
                    adds.add(arr[i]);
                }
            }
            int[] evensMatch = new int[evens.size()];
            int count = 0;
            for (int i = 0; i < adds.size(); i++) {
                int[] used = new int[evens.size()];
                if (find(used, evens, adds.get(i), evensMatch))
                    count++;
            }
            System.out.println(count);

        }
    }


    public static boolean isPrime(int m) {
        for (int i = 2; i * i <= m; i++) {
            if (m % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static boolean find(int[] used, ArrayList<Integer> evens, int num, int[] evensMatch) {
        for (int i = 0; i < evens.size(); i++) {
            if (isPrime(num + evens.get(i)) && used[i] == 0) {
                used[i] = 1;
                if (evensMatch[i] == 0 || find(used, evens, evensMatch[i], evensMatch)) {
                    evensMatch[i] = num;
                    return true;
                }
            }
        }
        return false;
    }
}