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)

 

posted @ 2023-04-27 15:28  Aneverforget  阅读(136)  评论(0编辑  收藏  举报