写了1天.....

解答步骤写的比较详细

def getPrimes(n):
    """获取2~n之间的素数,用于对素数进行判断"""
    primes = [True for _ in range(n+1)]
    for i in range(2, n+1):
        if primes[i]:
            yield i
            for j in range(i+i, n+1, i):
                primes[j] = False

def splitNums(nums):
    """用于将数字分为奇数和偶数部分"""
    odd = []
    even = []
    oddLen = 0
    evenLen = 0
    for num in nums:
        if num % 2 == 0:
            even.append(num)
            evenLen += 1
        else:
            odd.append(num)
            oddLen += 1
    return odd, oddLen, even, evenLen 

def removeValue(data, n, i, k):
    """从data的第i行开始去掉数字i"""
    for j in range(i, n):
        if k in data[j]:
            data[j].remove(k)
    return data 

def countValue(data, n, i, d):
    """统计data从i行开始,d中的元素总共出现的次数"""
    d = {k: 0 for k in d}
    for j in range(i, n):
        for value in data[j]:
            if value in d:
                d[value] += 1
    return d 

def func(nums):
    odd, oddLen, even, evenLen = splitNums(nums)
    maxGroup = min(oddLen, evenLen)
    if maxGroup == 0:   # 如果没有奇数或者偶数,那么直接必定不会出现素数伴侣
        return 0 
    primes = list(getPrimes(max(odd)+max(even)))
    # 每一行代表1个偶数,每一列代表一个奇数
    # 此处得到每个一行的偶数能和哪几个奇数组成素数伴侣
    data = [[j for j in range(oddLen) if even[i] + odd[j] in primes] for i in range(evenLen)]
    data = [row for row in data if row]  # 去掉不能和任何数字组成伴侣的偶数行
    if not data:  # 为空表示没有任何偶数能和奇数组成伴侣
        return 0 
    stack = []  # 存储结果用容器
    n = len(data)   
    for i in range(n-1):  
        # 分别对每一行进行迭代,判断改行是否符合一下的某一种情况(最后1行不需要判断,直接取最后1行的第一个数据即可)
        # 1 如果这一行为空,那么直接忽略这一行
        # 2 这一行只能和1个奇数 K 组成伴侣,那么就取这个偶数和K组成伴侣
        # 3 若这一行可以和多个奇数组成伴侣,那么去查找K,要求:后面行重复使用到K的次数最少
        # 4 去掉后面行用到的K
        # 5 若出现情况如:[[1,2], [1], [2, 3], [2, 4]],避免第一行取到1,
        #    在每一次取数之前,将数据按照候选奇数的多少依次排列
        data = data[:i] + sorted(data[i:], key=lambda x: len(x))
        if len(data[i]) == 0:
            continue
        if len(data[i]) == 1:
            stack.append(data[i][0])
            data = removeValue(data, n, i+1, data[i][0])
            continue
        d = countValue(data, n, i+1, data[i])
        minValue = data[i][0]
        c = d[minValue]
        if c == 0:
            stack.append(data[i][0])
            data = removeValue(data, n, i+1, data[i][0])
            continue
        for k, v in d.items():
            if v < k:
                minValue = k
                c = v
        stack.append(minValue)
        if c == 0:
            continue
        data = removeValue(data, n, i+1, minValue)
    if data[-1]:  # 最后1行不需要判断,直接取最后1行的第一个数据即可 
        stack.append(data[-1][0])
    return len(stack)


while True:
    try:
        n = int(input())
        nums = list(map(int, input().strip().split()))
        print(func(nums))
    except EOFError: break