蓝桥杯 算法提高 拿糖果

来源:互联网 发布:下载视频软件 编辑:程序博客网 时间:2024/05/08 00:38

题目分析

简单的dp,注意要构建素数表

#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;const int maxn = 100005;int vis[1005];int prime[1005];int dp[maxn];int init()  //构建素数表{    memset(vis,0,sizeof(vis));    int cnt = 0,len = sqrt(maxn) + 1;    for(int i = 2; i < len; i++)        if(!vis[i])        {            prime[cnt++] = i;            for(int j = i*i; j < len; j += i)                vis[j] = 1;        }    return cnt;}int main(){    int n;    int cnt = init();    while(scanf("%d", &n) != EOF)    {        memset(dp, 0, sizeof(dp));        for(int i = 1; i <= n; i++)        {            for(int j = 0; j < cnt; j++)            {                if(prime[j] > sqrt(i))                    break;                else if(i%prime[j] == 0)                    dp[i]=max(dp[i], dp[i-2*prime[j]]+prime[j]);            }        }        printf("%d\n", dp[n]);    }    return 0;}
0 0
原创粉丝点击