借鉴了别人的解题思路。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

// 判断一个数是否是素数
bool isPrime(int num) {
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) return false;
    }
    return true;
}

// 寻找素数伴侣 匈牙利算法 递归
bool find_prime(int odd, vector<int> &evens, vector<bool> &used, vector<int> &match) {
    // 对于传入的奇数,遍历每个偶数,进行比较
    for (int i = 0; i < evens.size(); i++) {
        // 如果奇数加偶数为素数,且这个偶数没有被使用过,则检查match数组
        if (isPrime(odd + evens[i]) && !used[i]) {
            used[i] = true;
            if (match[i] == 0 || find_prime(match[i], evens, used, match)) {
                match[i] = odd;
                return true;
            }
        }
    }
    return false;
}

int main() {
    int n = 0;
    cin >> n;
    vector<int> odds;   // 奇数
    vector<int> evens;  // 偶数
    for (int i = 0; i < n; i++) {
        int temp = 0;
        cin >> temp;
        if (temp % 2 == 0) evens.push_back(temp);
        else odds.push_back(temp);
    }
    
    int count = 0;   // 统计个数
    if (odds.size() == 0 || evens.size() == 0) {
        cout << count << endl;
    } else {
        vector<int> match(evens.size(), 0);     // 用于统计每个偶数的配对
        for (int i = 0; i < odds.size(); i++) {
            vector<bool> used(evens.size(), false);   // 用于统计每一轮奇数中,偶数是否使用过
            if (find_prime(odds[i], evens, used, match)) {
                count++;
            }
        }
        cout << count << endl;
    }
    return 0;
}