//按递增非递减序排列
void integer_split(itn n,int k)
{
int seq_num = 0; //拆分的序列
int *result = new int[k]; //保存拆分之后的结果
int i=0;
int remain=n-1; //剩余的还未被拆分的部分
//第一个拆分的部分应该小于n/k, 否则总和会大于原来的数
int nmt = n/k;
result[0] = 1;
while(result[0]<=nmt)
{
if(i==k-1) //找到一个解
{
result[i] += remain;
printf("第%2d种拆分:",++seq_num);
for(int j=0;j<=i;j++)
printf("%2d",result[j]);
printf("\n"); //打印每一个分割情况
i--;
result[i]++;
remain = result[i+1]-1; //打印结果之后,进行一次加1的回溯
}else if(remain >=result[i]) //继续向前搜索
{
i++;
result[i] = result[i-1];
remain-=result[i];
}else{ //分割部分不满足条件时进行回溯
i--;
result[i]++;
remain = remain + result[i+1]-1;
}
}
}
阅读(617) | 评论(0) | 转发(0) |