整数划分问题

// 整数s划分展示

#include <stdio.h>

void main()

{ int s,i,j,k,t,u; 

  static int a[21][800][21];

  printf("  input s(s<=20):"); scanf("%d",&s);

  a[2][1][1]=1;a[2][1][2]=1;a[2][2][1]=2;

  u=2;

  for(k=3;k<=s;k++)

    { for(j=1;j<=u;j++)

       { a[k][j][1]=1;           

         for(t=2;t<=k;t++)         // 实施在k-1所有划分式前加1操作  

            a[k][j][t]=a[k-1][j][t-1];    

       }

     for(i=u,j=1;j<=u;j++)

       if(a[k-1][j][1]<a[k-1][j][2])   // 若k-1划分式第1项小于第2项  

         { i++;               // 第1项加1为k的第i个划分式的第1项  

           a[k][i][1]=a[k-1][j][1]+1;     

           for(t=2;t<=k-1;t++)

             a[k][i][t]=a[k-1][j][t];

          }

     i++;a[k][i][1]=k;              // k的最后一个划分式为:k=k  

     u=i;

    }

  for(j=1;j<=u;j++)                // 输出s的所有划分式  

    { printf("%3d: %d=%d",j,s,a[s][j][1]);

      i=2;

      while(a[s][j][i]>0)

        {printf("+%d",a[s][j][i]);i++;}

      printf("\n");

     }

 }

 

// 整数s划分优化递推设计

#include <stdio.h>

void main()

{ int s,i,j,k,t,u; 

  static int a[1600][25];

  printf("input s(s<=24):"); 

  scanf("%d",&s);

  a[1][1]=1;a[1][2]=1;a[2][1]=2;u=2;

  for(k=3;k<=s;k++)

    { for(j=1;j<=u;j++)

        { i=k-1;           

          for(t=i;t>=1;t--)        // 实施在k-1所有划分式前加1操作  

             a[j][t+1]=a[j][t];

          a[j][1]=1;

        }

      for(t=u,j=1;j<=u;j++)

        if(a[j][2]<a[j][3])          // 若k-1划分式第1项小于第2项  

          { t++;

            a[t][1]=a[j][2]+1;    // 第1项加1  

            i=3;

            while(a[j][i]>0)

               {a[t][i-1]=a[j][i];i++;}

          }

      t++;a[t][1]=k;                // 最后一个划分式为:k=k  

      u=t;

     }

  for(j=1;j<=u;j++)                // 输出所有u个划分式  

    { printf("%3d: %d=%d",j,s,a[j][1]);

      i=2;

      while(a[j][i]>0)

         {printf("+%d",a[j][i]);i++;}

      printf("\n");

   }

}

posted on 2017-11-18 23:20  小星_log  阅读(131)  评论(0编辑  收藏  举报