/**/ /*描述 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 ;}