题目
思路
动态规划,整数分拆
具体整数分拆思路见百度百科:整数分拆
c++代码
#include <iostream>
#include<algorithm>
using namespace std;
int dp[102][102];
int main() {
int n;
for (int i = 1; i < 102; ++i)
dp[1][i] = dp[i][1] = 1; //base case
//i:需要分拆的数字
//j:分拆后最大的数
for (int i = 2; i < 102; ++i) {
for (int j = 2; j < 102; ++j) {
//划分数字中包含i + 划分中不包含i
if (i == j) dp[i][i] = 1 + dp[i][i - 1];
//此时,等同于i=j的值(即矩阵的上三角部分无太大意义)
else if (i < j) dp[i][j] = dp[i][i];
//拆分数中包含j + 拆分数中不包含j
//包含j:{j,{n1,n2,n3...}},其中n1+n2+n3...=i-j
else if (i > j) dp[i][j] = dp[i - j][j] + dp[i][j - 1];
}
}
while (cin >> n) {
cout << dp[n][n] << endl;
}
return 0;
}