【问题标题】:Staircase problem.. Why my code not working for n>21楼梯问题..为什么我的代码不适用于 n>21
【发布时间】:2020-11-13 11:44:18
【问题描述】:

Simran 正在以N 的台阶跑上楼梯,并且一次可以跳跃(跳跃)1 步、2 步或 3 步。您必须计算 Simran 可以通过多少种可能的方式跑上楼梯。

输入为N,输出为可能方式的数量。

为什么这段代码不适用于N>21

#include<bits/stdc++.h>
using namespace std;
long long fact(int n)
{
 return (n==0) || (n==1) ? 1 : n* fact(n-1);
}
int main()
{
    int n;
    cin>>n;
    long long count=0;
   
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            for(int k=0;k<=n;k++)
            {
                if((i*1+j*2+k*3)==n)
                {
                 count+=fact(i+j+k)/(fact(i)*fact(j)*fact(k));
                }
            }
        }
    }
    cout<<count;
    return 0;
}

【问题讨论】:

  • 您确定要使用 O(n^3) 算法吗?考虑使用 memoization 避免重复计算
  • 无关:注意#include&lt;bits/stdc++.h&gt;using namespace std; 的组合。分开它们都会造成麻烦(explanationmore explanation),但它们一起放大彼此的最坏影响并变成your code into a minefield
  • "#include using namespace std;" - 不要永远那样做。
  • @Berto99 比 O(n^3) 差很多——fact 不是 O(1)。

标签: c++ algorithm math


【解决方案1】:

如果 n 高达 21,那么fact(i+j+k) 在最坏的情况下(i=21,j=0,k=0)可以一直到 21。 21的阶乘是10^19的数量级,超出了long long的范围。所以会溢出。我建议你在这里使用动态编程。

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 2017-12-24
    • 2017-07-21
    • 1970-01-01
    • 2016-03-17
    • 2012-05-08
    • 2020-06-09
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多