1. 解题思路
#include <bits/stdc++.h>
#define MAXN 500
int dp[ MAXN] [ MAXN] ;
using namespace std;
void Split ( int p, int q)
{
for ( int n = 1 ; n <= p; n++ )
for ( int k = 1 ; k <= q; k++ )
{
if ( n == 1 || k == 1 )
dp[ n] [ k] = 1 ;
else if ( n < k)
dp[ n] [ k] = dp[ n] [ n] ;
else if ( n == k)
dp[ n] [ k] = 1 + dp[ n] [ k - 1 ] ;
else
dp[ n] [ k] = dp[ n] [ k - 1 ] + dp[ n - k] [ k] ;
}
}
int main ( )
{
int p = 5 , q = 5 ;
memset ( dp, 0 , sizeof ( dp) ) ;
Split ( p, q) ;
cout << "方案有" << dp[ p] [ q] << "种" ;
return 0 ;
}
升级版
#include <string.h>
#include <stdio.h>
#define MAXN 50
int dp[ MAXN] [ MAXN] ;
int p, q;
int Split ( int n, int k) {
if ( dp[ n] [ k] != 0 )
return dp[ n] [ k] ;
if ( n == 1 || k == 1 ) {
dp[ n] [ k] = 1 ;
return dp[ n] [ k] ;
} else if ( n < k) {
dp[ n] [ k] = Split ( n, n) ;
return dp[ n] [ k] ;
} else if ( n == k) {
dp[ n] [ k] = 1 + Split ( n, k - 1 ) ;
return dp[ n] [ k] ;
} else {
dp[ n] [ k] = Split ( n, k - 1 ) + Split ( n - k, k) ;
return dp[ n] [ k] ;
}
}
int main ( ) {
while ( scanf ( "%d %d" , & p, & q) != EOF ) {
memset ( dp, 0 , sizeof ( dp) ) ;
printf ( "%d\n" , Split ( p, q) ) ;
}
return 0 ;
}