题目描述
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。
输入:
有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。
输出:
输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。
输入描述:
输入说明 1 输入一个正偶数n 2 输入n个整数
输出描述:
求得的“最佳方案”组成“素数伴侣”的对数。
输入
4 2 5 6 13
输出
2
匈牙利算法在我的博客里面有提到,不懂的童鞋可以去看看~
import java.util.*;
public class Main {
static int[] nums ;
static int n ;
static boolean[][] graph;
static boolean[] used;
static int[] girl;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
n = cin.nextInt();
nums = new int[n];
for (int i = 0; i < n; i ++) {
nums[i] = cin.nextInt();
}
//判断条件
graph = new boolean[n][n];
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (i == j) {
graph[i][j] = false;
} else {
graph[i][j] = isPrime(nums[i] + nums[j]);
}
}
}
//匈牙利算法 girl表示归属(为0表示没有归属) used表示元素是否被标记(0未标记,1已标记)
girl = new int[n];
int sum = 0;
for (int i = 0; i < n; i ++) {
used = new boolean[n];
if (find(i)) {
sum += 1;
}
}
System.out.println(sum / 2);
}
}
static boolean find(int x) {
for (int i = 0; i < n; i ++) {
if (graph[x][i] && used[i] == false) {
used[i] = true;
if (girl[i] == 0 || find(girl[i])) {
girl[i] = x;
return true;
}
}
}
return false;
}
//素数条件判断
static boolean isPrime(int n) {
if (n == 1) {
return false;
}
for (int i = 2; i <= n/2; i ++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}