#include<bits/stdc++.h>
using namespace std;
int su[1300],a[110],dp[10010];
int suu(int num)
{
if(num == 1)
return 0;
else if(num == 2)
return 1;
else
{
for(int i = 2; i * i <= num ;i ++)
if(num % i == 0)
return 0;
}
return 1;
}
int main()
{
int n , i , j , k;
int pii = 0;
for(i = 1; i <= 10000; i ++)
if(suu(i))
{
pii ++;
su[pii] = i;
}
while(cin >> n)
{
memset(dp, 0 ,sizeof(dp));
memset(a, 0 , sizeof(a));
for(i = 1; i <= n; i ++)
cin >> a[i];
dp[0] = 1;
for(i = 1; i <= n ;i ++)
{
for(j = 10000; j >= a[i]; j--)
{
if(dp[j-a[i]] == 1)
dp[j] = 1;
}
}
int flag = 1;
for(i = pii; i >= 1; i --) //从大到小判断最大能组合出的素数
{
if(dp[su[i]] == 1)
{
cout << su[i] << endl;
flag = 0;
break;
}
}
if(flag)
{
dp[0] = 0;
for(i = 1; i < 10000; i ++) //i是区域,从大到小判断每个素数左右两边有没有可以组合出来的数
{
for(j = pii ; j >= 1; j --)
{
if((dp[su[j] - i] == 1)||(dp[su[j] + i] == 1))
{
cout << su[j] << endl;
flag = 0;
break;
}
}
if(!flag)
break;
}
}
}
return 0;
}
题目描述
有n个小朋友一起结伴同行去上学,每个小朋友的口袋里都有一些糖果,孩子的世界总是单纯而又可爱,现在其中的小刷提出了一个问题,如果把某些人(大于等于1个人)的糖果组合起来,能否组合出素数个糖果呢?如果能够组合出素数个糖果,能组成的最大的素数又是多少呢?如果不能,又最接近于哪个素数呢?如果一样接近,最大的又是哪个素数呢?
看,小刷的世界就是这么单洁而又可爱!
输入
第一行输入一个n,紧接着下一行输入n个整数ai表示n个小朋友口袋里的糖果。
(n <= 100 ai <= 10000,ai之和<=10000)
输出
对于每组数据,输出一个数answer,表示能组合出来的最大的素数,如果不能组合出素数, 输出能组合出来的最接近的素数,如果有多个,输出最大的那个。即满足abs(answer - i)是最小的,且answer最大。( i是能通过若干个小朋友组合出来的糖果数量)输出的素数小于10000
样例输入
1
3
1
10
样例输出
3
11
提示
输出的素数小于10000
先打素数表再用背包判断能组成出的所有数,再判断其中是否有素数,如没有,从大到小判断最接近的一个