整数的分划问题(续)---非递归法

来源:互联网 发布:车床和铣床编程的区别 编辑:程序博客网 时间:2024/04/29 20:49

上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法:

一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存储数据:关系如下:

for(i=1;i<=n;i++)
{  

   S[i][1]=1;
    S[1][i]=1;
}

for
(i=2;i<=n;i++)
{

   for
(j=2;j<=m;j++)
   {

     i f(i==j)
           S[i][j]=1+S[i][i-1];
       else if
(i<j)
           S[i][j]=S[i][i];
       else

           S[i][j]=S[i-j][j]+S[i][j-1];
   }

}


代码如下:

#include <stdio.h>int a[130][130];void fun(int n);int main(){int n;while (scanf("%d",&n)!=EOF){fun(n);}return 0;}void fun(int n){int i,j;for (i=1;i<=n;i++){a[i][1]=a[1][i]=1;}for (i=2;i<=n;i++){for (j=2;j<=n;j++){if (i==j){a[i][j]=1+a[i][j-1];}else if (i<j){a[i][j]=a[i][i];}else{a[i][j]=a[i][j-1]+a[i-j][j];}}}printf("%d\n",a[n][n]);}