整数划分问题(C语言求解)

来源:互联网 发布:知世故而不世故历圆滑 编辑:程序博客网 时间:2024/05/16 11:39

 



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