[2001年NOIP普及组] 数的计算
[2001年NOIP普及组] 数的计算
分析:
a[1] = 1
a[2] = a[1] + 1
a[3] = a[1] + a[2] + 1
a[4] = a[1] + a[2] + 1
a[6] = a[1] + a[2] +a[3] + 1
eg: 满足6的数有“6, 3 6, 1 3 6, 2 6, 1 2 6, 1 6”
思路:可以运用递推。先开一个数组存放在各个数字下 所有满足条件的数的个数的数组,初始化为1。再运用递推,算出要求的数字n。重点在于求出满足操作的递归式,在它的左边加上一个自然数,但该自然数不能超过原数的一半;加上数后,继续按此规则进行处理,直到不能再加自然数为止。那么就可以递归把 比n/2小的数的结果算出 加起来,得出结果。
代码如下:
#include<iostream>
using namespace std;
int main()
{
//使用递推公式计算
int a[1001];//定义一个存放在各个数字下 所有满足条件的数的个数的数组
for(int i = 0;i < 1001; i++)
a[i] = 1;//初始化存放数组
int i,j,n;
cin>>n;
for( i = 1;i <= n; i++)
for(j = 1; j <= i/2; j++)
a[i] = a[i] + a[j];//递推公式 eg:a[4]=a[1]+a[2]+a[4]
cout<<a[n]<<endl;
return 0;
}

浙公网安备 33010602011771号