百练 04 简单的整数划分问题
100ms 65536kB
描述
将正整数
n
表示成一系列正整数之和,
正整数
n
的这种表示称为正整数
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
参考:整数划分问题
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_NUM = 50 + 5;
int dp[MAX_NUM][MAX_NUM];
int main() {
int N;
while(cin >> N) {
// 将N划分成多个可以相同的整数
memset(dp, 0, sizeof(dp));
// dp(i,j)表示整数i的划分中,每个数不大于整数j的划分数
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(i < j) {
dp[i][j] = dp[i][i];
} else if(i > j) {
dp[i][j] = dp[i - j][j] + dp[i][j - 1];
} else {
dp[i][j] = dp[i][j - 1] + 1;
}
}
}
cout << dp[N][N] << endl;
}
}