题解 | #素数伴侣# 学习解题思路
素数伴侣
https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
String[] nums = reader.readLine().split(" ");
// 将输入的正整数存入数组
int[] numbers = new int[n];
for (int i = 0; i < n; i++) {
numbers[i] = Integer.parseInt(nums[i]);
}
// 计算最佳方案组成素数伴侣的对数
int count = findMains(numbers);
System.out.println(count);
} catch (IOException e) {
e.printStackTrace();
}
}
// 判断一个数是否为素数
public static boolean isPrime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
// 使用匈牙利算法寻找素数伴侣
public static int findMains(int[] numbers) {
int count = 0;
int[] match = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) {
match[i] = -1;
}
for (int i = 0; i < numbers.length; i++) {
boolean[] visited = new boolean[numbers.length];
if (find(numbers, i, match, visited)) {
count++;
}
}
return count / 2; // 每对素数伴侣会被计算两次,因此需要除以2
}
// 匈牙利算法实现
public static boolean find(int[] numbers, int i, int[] match, boolean[] visited) {
for (int j = 0; j < numbers.length; j++) {
if (!visited[j] && isPrime(numbers[i] + numbers[j])) {
visited[j] = true;
if (match[j] == -1 || find(numbers, match[j], match, visited)) {
match[j] = i;
return true;
}
}
}
return false;
}
}


