N的加数的不同组合

时间:2014-06-25 10:53:59

标签: c++ recursion

程序应该写出N的自然加数的多少个不同组合。所有的加数都不大,那么K(N,K <= 120)。 我的程序只包含递归:

int  F (int x,int s)  // s- total number, which is necessary to lay down the terms of
{
if (s == 0) // when total number == 0
    {
        ans++;   
        return 0;
    }
for (int i=x;i<=min(k,s);i++) // x - previous term
    F(i,s-i);           // we add a new summand -> subtract that number from the amount
}

主要部分:

int main ()
{
 cin >> n>> k;
 F(1,n);
 cout << ans;
}

那么,你能帮助我更快地完成我的程序吗?

2 个答案:

答案 0 :(得分:1)

您可以添加备忘录。不需要为固定的x和s多次计算F. 它需要稍微改变你的代码(使F实际上返回计算值而不是incerementing ans)并添加一个数组来保存已计算的值。

答案 1 :(得分:0)

这是一个有趣的exersize;

int F (int x,int s)
{
    static map< int, map< int, int > > table;

    if( (x==s) || (s==0) ) return 1;
    if( x > s ) return 0;

    auto itr1 = table.find(x);
    if( itr1 != table.end() )
    {
        auto& sub = itr1->second;
        auto itr2 = sub.find(s);
        if( itr2 != sub.end() )
        {
            return itr2->second;
        }
    }

    int ans=1;
    for ( int i=x; i<s; ++i )
        ans += F(i,s-i);

    table[x][s]=ans;
    return ans;
}