[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;

}

posted @ 2022-08-15 11:26  shanyingrui  阅读(236)  评论(0)    收藏  举报