您的位置:首页 > 其它

蓝桥杯 算法提高 拿糖果

2016-05-19 20:49 113 查看

题目分析

简单的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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: