词典序法生成整数划分
词典序法是生成各种组合模式的通用方法。对一些组合模式,人们已经找到简单的
格雷通路的构造法则,词典序法与这样的基于格雷通路的方法比起来,速度较慢。因
此,在要生成的组合模式存在简单的格雷通路的构造的情形下,一般不用词典序生成
算法。但对另一些组合模式,不存在或者目前尚未发现简单的格雷通路的构造法则,
这个时候,我们就可以考虑用词典序法来生成需要的组合模式。
整数划分是指将一自然数n分成一列数a1,a2,...aj,使a1+a2+...+aj=n.
其中,a1>=a2>=...>=aj>=1.
整数划分目前尚未发现简单的格雷通路构造法则,因此,这里我用词典序法将其实
现如下:
void Partition( int n ){
int *List=new int[n+1], q=0, m=1, t, j;
List[0]=n;
while( 1 ){
copy( List, List+m, ostream_iterator<int>(cout," ") );cout<<endl;
if( q<0 ) return ;
if( List[q]==2 )
--List[q--], List[m++]=1;
else{
--List[q]; t=m-q;
for( j=1; j<=t/List[q]; ++j )
List[q+j]=List[q];
if( t%List[q]==0 )
m=q+j, q=m-1;
else
m=q+j+1, List[q+j]=t%List[q], List[q+j]==1? q=m-2 : q=m-1;
}
}
delete []List;
}