您的位置:首页 > 其它

算法提高 拿糖果 DP

2017-12-02 16:28 204 查看
问题描述

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

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

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

输入格式

  一个整数N

输出格式

  最多可以拿多少糖

样例输入

15

样例输出

6

数据规模和约定

  N <= 100000

dp【i】为糖果为i个的时候最多能拿多少

dp[i]=max(dp[i],dp[i-2*prime[i]]+prime[i])

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include<algorithm>

#include<iostream>

#include<math.h>

#include<queue>

using namespace std;

int prime[50000];

int dp[100005];

int book[100005];

int cnt = 0;

void dabiao()

{

    int len = sqrt(100005);

    for(int i = 2; i <= len; i++)

    {

        if(book[i] == 0)

        {

            prime[cnt++] = i;

            for(int j = i * i; j <= len; j = j + i)

                book[j] = 1;

        }

    }

}

int main()

{

    int n;

    dabiao();

    cin>>n;

    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
<<endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: