Debugging in Hungarian Maximum Matching

Question:

I wrote a code to solve the following algorithm question:

Given a number of positive integers all larger than 1, find the maximum number of pairs whose sum is a prime number. The number of positive integers is always an even number.
For example, given 2 5 6 13 2 11, the answer is 3 since 2+5=7, 6+13=19, 2+11=13.

I wrote the following code to solve the problem. I know this is not the optimal algorithm, but I just cannot find the bug in it that results in my failure in test cases.

def _isPrime(num):
    for i in range(2, int(num**0.5)+1):
        if num % i==0:
            return False
    return True

def findPairs(odds, evens, pairDict):
    if len(odds)==0 or len(evens)==0:
        return 0
    
    key=' '.join(list(map(str, odds+evens)))
    if key in pairDict:
        return pairDict[key]  
    
    n=0
    for i in range(len(evens)):
        newOdds=odds.copy()
        newEvens=evens.copy()
        del newOdds[0]
        del newEvens[i]
        if _isPrime(odds[0]+evens[i]):
            n=max(n,findPairs(newOdds, newEvens, pairDict)+1)
        else:
            n=max(n,findPairs(newOdds, newEvens,pairDict))
    pairDict[key]=n
    return n

numbers=list(map(int,input().split()))
odds=[i for i in numbers if i%2==1]
evens=[j for j in numbers if j%2==0]
pairDict={}
print(findPairs(odds,evens,pairDict))

Can someone help me find where the problem is. Thanks a lot!

Asked By: Tingkang Wang

||

Answers:

The problem is that the recursion always tries to match the first odd number with some even number. This can go wrong if there are fewer even numbers than odd numbers because it will use up an even number that could have been used for a later match.

For example, consider "13 2 3". This code will return 0, but 2+3 is a prime.

You could fix it by also allowing an extra recursion case where the first odd number is discarded without reducing the even list.

    del newOdds[0]
    n=max(n,findPairs(newOdds, newEvens, pairDict)) # added line
    del newEvens[i]
Answered By: Peter de Rivaz
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.