CodeVs 1011 数的计算

CodeVs 1011 数的计算
                       By MPS
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目描述 Description

我们要求找出具有下列性质数的个数(包含输入的自然数n):

先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:

1.          不作任何处理;

2.          在它的左边加上一个自然数,但该自然数不能超过原数的一半;

3.          加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入描述 Input Description

一个数n

输出描述 Output Description

满足条件的数的个数

样例输入 Sample Input

6

样例输出 Sample Output

6

数据范围及提示 Data Size & Hint

6个数分别是:

6

16

26

126

36

136

分析:
本来不想写解题报告的,毕竟too simple,但是为了巩固递推算法,所以在此特意写了2种算法的解题报告
算法1:记忆化搜索
             对于每一层我们只需要搜索1——m/2即可,然后加起来,这里为了避免TLE,特别的,采用了记忆化的手段
             代码不再赘述
算法2:递推
             f(n)=f(1)+f(2)+f(3)+...+f(n/2)+1      (n≥1)
            <归纳法证明>
             设F[n]为答案集,则经过观察
              f[2]=1(2)+1(12)=2=f[1]+1
              f[3]=1(3)+1(13)=2=f[1]+1
              f[4]=1(4)+1(24)+1(124)+1(14)=4=f[2]+f[1]+1
                                   .
                                   .
                                   .
              易求得:f(n)=f(1)+f(2)+f(3)+...+f(n/2)+1 (n≥1)
              初始条件:f(1)=1
              时间复杂度O(N(N/2))
代码:
#include <iostream>
using namespace std;

const int MaxN=1001;

long long n,i,j,f[MaxN];

int main(){
   cin>>n;
   f[1]=1;
   for(i=2;i<=n;i++){
       f[i]=1;
       for(j=1;j<=i/2;j++)
         f[i]+=f[j];
   }
   cout<<f[n]<<endl;
   return 0;
}

-----------------------------------------------------------------------------------------------------------------------------------------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值