HJ28 素数伴侣
看到讨论说这是匈牙利算法,多目标跟踪。
求解最大匹配问题
带你入门多目标跟踪(三)匈牙利算法&KM算法 - 知乎 (zhihu.com)
1 ''' 2 这题配对很难理解,理解了一天,看程序理解很乱,还是得看输出,逐个跟着。 3 寻找最大配对数方法如下: 4 在保持现有配对数不变的情况下,继续寻找可行配对。虽然配对数目不变,但是配对的具体元素改变。 5 以奇数列表为外循环。 6 为保证递归不进入死循环,需要两列表对偶数做记号 7 visited=[]对已经遍历过的偶数下标做标记, 8 match=[]记录与该下标偶数相加为素数的奇数。 9 模拟过程如下, 10 在for循环里为每个元素提供一个初始化列表; 11 元素visit后下标记录为1, 12 若该下标没被奇数占领,记录该新元素奇数;若改下标被占领记录,把占领元素向后寻位置, 13 如果有位置则替换位置;若无位置,该奇数元素向后寻位置。 14 (如此遍历,在保留素数对数不减的情况下,寻找更多的素数对数。) 15 这样,每个奇数与最后可匹配的偶数匹配 16 方法很巧妙。 17 ''' 18 def cprime(item): 19 if item<=3: 20 return True 21 for i in range(2,int(item**0.5)+1): 22 if item%i==0: 23 return False 24 else: 25 return True 26 print(cprime(5)) 27 def find_even(odd): 28 for k,even in enumerate(evens): 29 if cprime(odd+even) and visited[k]==0: 30 visited[k]=1 31 if match[k]==0 or find_even(match[k]): 32 match[k]=odd 33 return True 34 return False 35 no=int(input()) 36 l=list(map(int,input().split())) 37 odds,evens=[],[] 38 for i in l: 39 if i%2==0: 40 evens.append(i) 41 else: 42 odds.append(i) 43 #odds=[1,2,3,7,9,11] 44 #evens=[4,6,8,10] 45 count=0 46 match=[0]*len(evens) 47 for odd in odds: 48 visited=[0]*len(evens) 49 if find_even(odd): 50 count+=1 51 print(count)