洛谷P1028 数的计算

题目描述

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

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

  1. 不作任何处理;

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

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

输入格式

111个自然数nnn(n≤1000n le 1000n1000)

输出格式

111个整数,表示具有该性质数的个数。

输入输出样例

输入
6
输出
6

说明/提示

满足条件的数为

6,16,26,126,36,136

这题用简单递推就可以做出来了(找规律)

/*
递推法
举个例n=12
每一轮大循环打印一次数组的结果如下(循环了11次,为1时答案唯一直接存了):
0 1 2 0 0 0 0 0 0 0 0 0 0
0 1 2 2 0 0 0 0 0 0 0 0 0
0 1 2 2 4 0 0 0 0 0 0 0 0
0 1 2 2 4 4 0 0 0 0 0 0 0
0 1 2 2 4 4 6 0 0 0 0 0 0
0 1 2 2 4 4 6 6 0 0 0 0 0
0 1 2 2 4 4 6 6 10 0 0 0 0
0 1 2 2 4 4 6 6 10 10 0 0 0
0 1 2 2 4 4 6 6 10 10 14 0 0
0 1 2 2 4 4 6 6 10 10 14 14 0
0 1 2 2 4 4 6 6 10 10 14 14 20
12/2=6
12的左边可以为1 2 3 4 5中的数,所以f[12]=f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+1(这个1是加上本身)
既f[12]=1+2+2+4+4+6+1=20
所以得到递推公式
f[n]=f[1]+f[2]+.....+f[n/2]+1;
*/
#include<stdio.h>
#include<iostream>
using namespace std;
int f[1001]= {0,1};
void solve(int n)
{
    
    for(int i=2; i<=n; i++)
    {
        for(int j=1; j<=i/2; j++)
            f[i]+=f[j];
        
        f[i]++;
    }
}
int main()
{
    int n;
    cin>>n;
    solve(n);
    cout<<f[n]<<endl;
    return 0;
}