程序应该写出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;
}
那么,你能帮助我更快地完成我的程序吗?
答案 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;
}