我试图使用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;
}
答案 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
函数。两种情况都使用变量t
或n
。它会解决你的问题。
答案 2 :(得分:1)
以下是一些问题:
在solve
中,您有ans = (n,solve(n/2)...);
前导n
无效。您是否打算将此作为max
的参数列表?如果是,则需要添加max
。否则它只是一个逗号表达式,您也可以删除前导n
。
在main
中,dp
的初始化存在问题。当i
为0时,考虑第一次循环。在这种情况下,i/2
等也将为零,因此dp
值将是未定义的。尝试在循环外明确设置dp[0]
,然后在索引1
处开始循环。
在main
打印解决方案时,您可能希望在\n
格式字符串的末尾添加新的printf
。
正如其他人所说,当从solve
致电main
时,您正在传递n
而不是t
。