版权声明:本文为博主原创文章,未经博主允许不得转载。
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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
分析:素数和一定是奇数和偶数相加的结果,先把输入的数分成奇偶两部分,然后再用匈牙利算法
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef int bool;
#define false 0
#define true 1
#define N 100
int edge[N][N],cx[N],cy[N];//edge记录两点的关系,如果两点相连,则edge【i】【j】为1int visited[N];//判断该店是否被访问过int nx,ny,res;
bool isprime (int m,int n)//判断和是否为素数{
int flag,i,sum=m+n;
flag=true;
for(i=2;i//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路{
cx[u]=v;
cy[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,a[100]={0},a1[100]={0},a2[100]={0};
nx=0,ny=0,res=0;
memset(cx,0xff,sizeof(cx));//初始值为-1表示两个集合中都没有匹配的元素!memset(cy,0xff,sizeof(cy));
memset(edge,0,sizeof(edge));
for(i=0;i
{
scanf("%d",&a[i]);
if(a[i]%2==1)
a1[nx++]=a[i];
else
a2[ny++]=a[i];
}
for(i=0;i
{
for(j=0;j
{
if(isprime(a1[i],a2[j]))
edge[i][j]=1;
}
}
for(i=0;i
{
if(cx[i]==-1)
{
memset(visited,0,sizeof(visited));
res+=path(i);
}
}
printf("%d\n",res);
}
}