P1028 数的计算
P1028 数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数nn):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入格式
1个自然数nn(n<=1000)
输出格式
1个整数,表示具有该性质数的个数。
输入输出样例
输入
6
输出
6
说明/提示
满足条件的数为
6,16,26,126,36,136
1 解法: 2 #include<bits/stdc++.h> 3 using namespace std; 4 map<int,int> mp;//保存搜索的结果,优化代码 5 int n; 6 int dfs(int x){//深度优先搜索 7 if(mp[x]) return mp[x];//已经 有这个值了,可以返回 8 int sum=1;//本身是1 9 for(int i=1;i<=x/2;i++){ 10 sum+=dfs(i); 11 }//对这个数 的每个 都搜索完成之后 ,保存; 12 mp[x]=sum;//如6->6/2=3,搜索1,2,3的和 赋值给mp[6] 13 //由于 mp[i] 是从 mp[1] + ... + mp[i/2] + 1 转移过来的 14 return sum; 15 } 16 int main() 17 { 18 cin>>n; 19 cout<<dfs(n)<<endl; 20 return 0; 21 } 22 //1000 结果:1981471878