蓝桥杯 算法提高 拿糖果(dfs+记忆化搜索)

来源:互联网 发布:数据转换器 编辑:程序博客网 时间:2024/05/29 11:42

算法提高 拿糖果  

时间限制:1.0s   内存限制:256.0MB
   
问题描述
  妈妈给小B买了N块糖!但是她不允许小B直接吃掉。
  假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数。这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖。然后小B就可以接着拿糖。
  现在小B希望知道最多可以拿多少糖。
输入格式
  一个整数N
输出格式
  最多可以拿多少糖
样例输入
15
样例输出
6
数据规模和约定
  N <= 100000


思路:dfs+记忆化搜索

p既要满足质数(1不是质数)又要满足因数

AC代码:

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=1e5+10;int d[maxn];bool check(int v){for(int i=2;i<=sqrt(v);i++){if(v%i==0)return false ;}return true ;}int dfs(int i){int& ans=d[i];if(ans>0)return ans;for(int j=2;j<=sqrt(i);j++){if(check(j) && i%j==0)  if(i>=2*j)   ans=max(ans,dfs(i-2*j)+j);      else if(i>=j)   ans=max(ans,dfs(i-j)+j);}return ans;}int main(){int n;while(scanf("%d",&n)==1){memset(d,0,sizeof(d));printf("%d\n",dfs(n));}return 0;} 



1 0
原创粉丝点击