ZUFE 问题 A: 小刷上学记

#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

先打素数表再用背包判断能组成出的所有数,再判断其中是否有素数,如没有,从大到小判断最接近的一个

猜你喜欢

转载自blog.csdn.net/Ant_e_zz/article/details/80377991