• 蓝桥杯 拿糖果


    问题描述
      妈妈给小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-prime[j]*2]+prime[j]);
    代码如下:
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath> 
    #include <cstring>
    using namespace std;
    int prime[100005];
    int dp[100005];
    int cnt;
    void create()
    {
       cnt=0;
      int f;
      for(int i=2;i*i<=100005;i++)
      {
          f=1;
            for(int j=2;j*j<=i;j++)
            {
                if(i%j==0)
                {
                 f=0;
                 break;
                }
            }
            if(f==1)
            prime[cnt++]=i;
      }
    }  
    int main()
    {
        int m,num;
        create();
       scanf("%d",&m); 
       
              memset(dp,0,sizeof(dp));
        for(int i=1;i<=m;i++)
        {
        
            for(int j=0;j<cnt;j++)
            {
            //    cout<<j<<endl;
                if(prime[j]>sqrt(i))
                break;
                if(i%prime[j]==0)
                dp[i]=max(dp[i],dp[i-prime[j]*2]+prime[j]);
            }
            //    printf("dp[%d]=%d
    ",i,dp[i]);
       }
         printf("%d
    ",dp[m]);
       
    }
  • 相关阅读:
    curl 的用法指南
    详说 Cookie, LocalStorage 与 SessionStorage
    session,cookie和token究竟是什么
    SSL/TLS协议交互流程分析
    SSL/TLS协议运行机制的概述
    SSL常见的几个类型说明
    HTTP 的前世今生:一次性搞懂 HTTP、HTTPS、SPDY、HTT
    汉化版的脚本
    可以快速的展现当前服务器的配置、IO、SpeedTest内置下载速度的脚本
    F5 清除http 缓存
  • 原文地址:https://www.cnblogs.com/a249189046/p/6679248.html
Copyright © 2020-2023  润新知