题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数nn):
先输入一个自然数nn(n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入格式
11个自然数nn(n \le 1000n≤1000)
输出格式
11个整数,表示具有该性质数的个数。
输入输出样例
输入 #1复制
6
输出 #1复制
6
说明/提示
满足条件的数为
6,16,26,126,36,136
分析:
难得,这题是我自己想出来的,居然没有看题解......这么说是不是显得我好弱....
设一个f数组存数,显然f[1]=1,f[2]=2,接着分析f[3],首先3本身肯定是一个,所以f[3]+=1。然后把3放在右边,左边可以加什么呢?
显然,可以加任何1到3/2的组合,就是f[1]。n==4呢?4是一个,然后4放在右边,左边可以放什么,可以放1的所有组合,还可以放2的所有组合,即f[4]+=f[1]+f[2]
推广到n,首先n本身是一个,f[n]+=1,然后从1到n/2的所有数,都可以加上去,即f[n]+=f[1]+f[2]+....+f[n/2]
上AC代码:
#include<iostream>
using namespace std;
int n;
int f[1005];
int main()
{
cin>>n;
f[1]=1;
f[2]=2;
for(int i=3;i<=n;i++)
{
int mid=i/2;
f[i]+=1;
for(int j=1;j<=mid;j++)
f[i]+=f[j];
}
for(int i=n;i<=n;i++)
cout<<f[i];
//cout<<i<<" : "<<f[i]<<endl;
return 0;
}