您的位置:首页 > 其它

算法提高 拿糖果

2017-04-27 09:09 232 查看
问题描述

  妈妈给小B买了N块糖!但是她不允许小B直接吃掉。

  假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数。这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖。然后小B就可以接着拿糖。

  现在小B希望知道最多可以拿多少糖。

  

输入格式

  一个整数N

  

输出格式

  最多可以拿多少糖

  

样例输入

15

样例输出

6

数据规模和约定

  N <= 100000

看清楚是质因数,先筛法素数打表

#include"iostream"
#include"string.h"
#include"math.h"
using namespace std;

int dp[100100];
int su[100100];
void check()
{
memset(su,1,sizeof(su));
for(int i=2;i<=sqrt(100100);i++)
if(su[i])
for(int j=i*2;j<100100;j+=i)
su[j]=0;
}
int main()
{
int n;
check();
cin>>n;
memset(dp,0,sizeof(dp));
for(int i=4;i<=n;i++)
{
if(su[i]) continue;
for(int j=2;j<=sqrt(i);j++)
{
if(su[j]&&i%j==0)
{
dp[i]=max(dp[i],dp[i-2*j]+j);
//cout<<i<<" "<<dp[i-2*j]+j<<endl;
}
}
//cout<<i<<" "<<dp[i]<<endl;
}
cout<<dp
<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: