整数划分问题用递归会重复计算很多次,浪费空间和时间。122的划分情况已经超过了int的表示范围,故不妨开一个二维数组再用两重循环,在O(N^2)的时间内得到结果。
#include <iostream>
using namespace std;
int divideInteger(int n){
int q[122][122]={0};//q[n][m]在正整数n的所有划分中,最大加数不大于m的划分个数
for (int i=1; i<=n; ++i){
for (int j=1; j <= n; ++j){
if (i == 1 || j== 1){
q[i][j] = 1;
} else{
if (i < j){
q[i][j] = q[i][i];
} else{
if (i == j){
q[i][j] = 1 + q[i][i - 1];
} else{//i > j
q[i][j] = q[i][j-1] + q[i - j][j];
}
}
}
}
}
return q[n][n];
}//n = 121时,q[n][n] = 18亿+,n为122时,结果就溢出了(int型)
int main(){
int n=122;
while (cin >> n){
cout <<divideInteger(n) << endl;
}
return 0;
}
//zzuwenjie 2017-3-8 15:50:17