www.pudn.com > wanlousheji.rar > lkq.cpp


// 求划分 
//  
#include "iostream.h" 
#include "iomanip.h" 
 
#define max 1024 
 
int a[max][max]; 
int tp; 
 
void print( int *map , int len ) 
{ 
 static int total = 1; 
// cout<<"划分"<a[i][0]) 
			count++; 
	} 
	return count; 
} 
 
int check(int i) 
{ 
	int j; 
	if(a[i][0]==1) 
		return 1; 
	for(j=1;j= 1 && m == 1 ) 
 { 
 // flag1: 
 // 当 m=1 时,只有一种分法,n = 1 + 1 + ...  
 // 与 flag2 合作,可以完成这种分解的输出 
  map[len] = 1; 
  p( n - 1 , m , map , len+1 ); 
  return 1; 
 } 
 else if( n == 0 && m == 1 ) 
 { 
 // flag2: 
 // 配合 flag1 ,完成对 m=1 划分的处理 
  print( map , len ); 
  return 1; 
 } 
 else if( n == 1 && m > 1 ) 
 { 
 // flag3: 
 // 当 n=1 时,分解已经完成,进行输出处理 
  map[len] = n; 
  print( map , len + 1 ); 
  return 1; 
 } 
 else if( n < m ) 
 { 
 // flag4: 
 // 由于所处位置的关系,此时及以下情况中的 m , n 都 > 1 
  return p( n , n , map , len ); 
 } 
 else if( n == m ) 
 { 
 // flag5: 
 // 这种情况下,map 位赋为 m,则可完成一种划分 
  map[len] = m; 
  print( map , len + 1 ); 
 // 继续下种情况的处理 
  return p( n , m - 1 , map , len ) + 1; 
 } 
 else 
 { 
 // 有两种处理方法 
 // 方法一: 
 // 当前 map 位赋为 m , 处理 p( n-m , m ) 
  map[len] = m; 
  int s1 = p( n - m , m , map , len + 1 ); 
 // 方法二: 
  int s2 = p( n , m - 1 , map , len ); 
  return s1 + s2; 
 } 
 
} 
void main() 
{ 
 int map[max] = { 0 }; 
 int len = 0; 
 int n,k; 
 while(cin>>n>>k) 
 { 
	tp=0; 
// cout<<"total="<