


/**//*
描述 Description
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入格式 Input Format
输入n,k (6<n<=200,2<=k<=6)
输出格式 Output Format
一个整数,即不同的分法。
Input : 7 3
output: 4
*/

/**//*
解题思路:
我用的是一种比较慢的搜索扩展方法:
比如:
7 = 1+6 6 又可以扩展成:6 = 1+5 很显然这是一个递归的过程
7 = 2+5 5 --> 5= 2+3 不过要注意的是:只要在扩展过程中保证当前所扩展的值不小于前一个即可
7 = 3+4
*/
#include <stdio.h>
#define MAX 101

int n,k ;
long total = 0 ;
void fenjie(int s,int t,int end,int *sum)
...{
int p,q ;

if(t == k)/**//*找到一个*/
...{
total ++ ;
/**//*for(q = 1 ; q <= k ; q++)
printf("%d ",sum[q]);
printf(" ");*/
}
else
...{
for(p=s ; p<=end/2 ; p++)
...{
sum[t] = p;
sum[t+1] = end-p;

fenjie(p,t+1,sum[t+1],sum); /**//*方法是从当前结点扩展开出,递归进行求解*/
}
}
}
int main(void)
...{
int i,j,sum[MAX] = ...{0};
scanf("%d %d",&n,&k);
for(i=1 ; i<=n/2 ; i++)
...{
sum[1] = i ;
sum[2] = n-i;
fenjie(i,2,sum[2],sum);
}
printf("%ld ",total);/**//*output the result*/
return 0 ;
}

本文介绍了一种通过递归搜索实现的整数分拆算法,该算法能够计算将一个整数n分成k份的不同组合数量,确保每份不为空且任意两份不同。输入为整数n和k,输出为不同的分拆方案总数。
1998

被折叠的 条评论
为什么被折叠?



