递归之整数划分-CSDN博客

44 阅读1分钟

整数划分问题用递归会重复计算很多次,浪费空间和时间。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