时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 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
解题思路:
根据递推思想,原数n为第一列,往左侧一列加数,从1一直加到n/2,加上的这一列后检查这一列,发现仍然大于等于2的某位d,就再往它左侧一列加数,从1加到d/2......就这样,每一项都包含其1~n/2子项的所有情况,另外每一项的初始数目都为1(自身)。
递推公式为:num(n) = 1 + num(1) + num(2) + num(3) +...+num(n/2) (num(1) = 1)。欲求 num(n) 须从 num(1) 开始一直递归,加到num(n)。
以n=6为例,num(6) = 1 + num(16) + num(26) + num(126) + num(36) + num(136) = 6 .
AC代码如下:
#include<iostream>
using namespace std;
int num[1000];
int main()
{
int n;
cin>>n;
if( n==0 ){
cout<<"0"<<endl;
return 0;
}
num[1]=1;
for( int i=2;i<=n;i++ ){ // a[n] = a[1]+a[2]+...+a[n/2]
num[i]=1;
for( int j=1;j<=i/2;j++ ){
num[i]+=num[j];
}
}
cout<<num[n]<<endl;
return 0;
}