题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数 nn ):
先输入一个自然数 nn ( n \le 1000n≤1000 ),然后对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
11 个自然数 nn ( n \le 1000n≤1000 )
输出格式:
11 个整数,表示具有该性质数的个数。
输入输出样例
输入样例#1:
6
输出样例#1:
6
说明
满足条件的数为
6,16,26,126,36,136
解法:考虑dp
dp[i]为i作为自然数能构成满足条件的数的个数。
递推方向显然从小数推到大数,这样能够保证在计算某一个数时比它小的数都已经被计算出来。
初态dp[1] = 1
对于每个数j <= i / 2, dp[i] += dp[j]
再加上自己本身。最后输出即可
#include <bits/stdc++.h>
using namespace std;
int f[2000];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
f[1] = 1;
for(int i = 2; i <= n; i++)
{
f[i]++;
for(int j = 1; j <= i / 2; j++)
f[i] += f[j];
}
// for(int i = 1; i <= 9; i++)
// cout << f[i] << endl;
cout << f[n] << endl;
return 0;
}