题目分析
简单的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;
}