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;
}