我们要求找出具有下列性质数的个数(包含输入的自然数 nn):
先输入一个自然数 n(n \le 1000)n(n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
k加上数后,继续按此规则进行处理,直到不能再加自然数为止。
输入格式
11 个自然数 n(n \le 1000)n(n≤1000)。
输出格式
11 个整数,表示具有该性质数的个数。
样例说明
满足条件的数为:
66,1616,2626,126126,3636,136136。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
6
样例输出复制
6
这一题本来想暴力,但是比较麻烦,所以就自己找找规律,发现动态规划可以做,其实也就是一个递推的过程,首先每个数字本身就是一种,所以初始为1 ,2是有本身和12组成,那么3是有3和13组成,4是由4,14,124组成,很明显,124和14都可以拆解为2和4的组合,所以我们只要枚举从1到2*i<=n的情况即可
//@authro:hairu,wu
//@from:ahut
#include<iostream>
#include<memory.h>
using namespace std;
int main(){
int n;
cin >> n;
int dp[2000];
for(int i=0;i<2000;i++){
dp[i]=1;
}
for(int i=2;i<=n;i++){
for(int j=1;2*j<=i;j++){
dp[i]=dp[i]+dp[j];
}
}
cout<<dp[n]<<endl;
return 0;
}