#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
先打素数表再用背包判断能组成出的所有数,再判断其中是否有素数,如没有,从大到小判断最接近的一个