我的代码中的运行时错误

时间:2015-12-25 15:05:41

标签: c dynamic-programming memoization

我试图使用memoization从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;
}

3 个答案:

答案 0 :(得分:1)

问题很可能是由于:

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

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

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

答案 1 :(得分:1)

您获得运行时错误

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

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

答案 2 :(得分:1)

以下是一些问题:

  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. 正如其他人所说,当从solve致电main时,您正在传递n而不是t