您的位置:首页 > 其它

算法提高 拿糖果(动态规划)

2017-03-09 01:13 232 查看

算法提高 拿糖果

问题描述

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

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

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

输入格式

  一个整数N

输出格式

  最多可以拿多少糖

样例输入

15

样例输出

6

数据规模和约定

  N <= 100000

  

我滴思路:

动态规划题,关键在于找到递推关系。

设dp[i]数组为N块糖时小明可以拿到的最大的糖果数。

prime[j]为质数表

容易知道

dp[i]=max(dp[i],dp[i-prime[j]]+prime[j]);

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int A[100005];
int prime[10000];
int dp[100005];
int cnt = 0;

void create()
{
int len = sqrt(100005);
for (int i = 2; i < len; i++)
{
if (A[i] == 0)
prime[cnt++] = i;
for (int j = 2; j*i < 100005; j++)
{
A[i*j] = 1;
}
}
}

int main()
{
int N;
cin >> N;
create();
for (int i = 1; i <= N; i++)
{
for (int j = 0; j < cnt; j++)
{
if (prime[j] > sqrt(i))
break;
if (i%prime[j] == 0)
dp[i] = max(dp[i], dp[i - 2 * prime[j]] + prime[j]);
}
}
cout << dp
;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 算法