我的代码中的运行时错误

Runtime error in my code

我试图通过 SPOJ 解决这个问题:http://www.spoj.com/problems/COINS/ 使用记忆,但我一直收到运行时错误并且无法弄清楚原因。这是我的代码:

#include<stdio.h>
long long int max(long long int a,long long int b)
{
    if(a >= b)
        return a;
    else
        return b;
}
long long int dp[100000];
long long solve(long long int n)
{
    long long ans;
    if(n<=50000)
        return dp[n];
    else
        ans=(n,solve(n/2)+solve(n/3)+solve(n/4));
        return ans;

}
int main()
{
    long long int n;
    int t;

   for(int i = 0;i <=50000;i++)
   {
        dp[i] = max(i,dp[i/2] + dp[i/3] + dp[i/4]);
    }

    while((scanf("%d",&t))>0)
        printf("%lld",solve(n));
    return 0;
}

问题很可能是因为:

while((scanf("%d",&t))>0)
       printf("%lld",solve(n));

您正在阅读 t 但传递了未初始化的 n。您可能想将 t 传递给 solve():

while((scanf("%d",&t))>0)
       printf("%lld",solve(t));

出现运行时错误的原因

while((scanf("%d",&t))>0)
    printf("%lld",solve(n));

在这里,您在变量 t 中获得输入,但将变量 n 传递给 solve 函数。对这两种情况都使用变量 tn。它会解决你的问题。

这里有几个问题:

  1. solve中,你有ans = (n,solve(n/2)...);前导的n没有作用。您是否打算将其作为 max 的参数列表?如果是这样,您需要添加 max。否则它只是一个逗号表达式,您不妨删除前导 n.

  2. main中,你对dp的初始化有问题。考虑第一次通过循环,当 i 为 0 时。在这种情况下,i/2 等也将为零,因此那些 dp 值将是未定义的。尝试在循环外显式设置 dp[0],然后从索引 1 开始循环。

  3. main 中打印解决方案时,您可能希望将换行符 \n 添加到 printf 格式字符串的末尾。

  4. 正如其他人所指出的,当从 main 调用 solve 时,您传递的是 n 而不是 t