版权声明:本文为博主原创文章,未经博主允许不得转载。
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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】为1 int 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); } }