【发布时间】:2016-03-31 13:19:14
【问题描述】:
我试图从 SPOJ:http://www.spoj.com/problems/COINS/ 使用 memoization 解决这个问题,但我不断收到运行时错误,无法弄清楚原因。这是我的代码:
#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;
}
【问题讨论】:
-
您是否尝试使用调试器(如 gdb)调试您的代码?
-
根据问题,t 的最大值为 1,000,000,000,大于 int 的最大范围。为 t 尝试 long 而不是 int。
-
@MahediSabuj 不在 32 位系统上。即使是带符号的 32 位 int 也可以处理大于 2,000,000,000 的量级。提示:什么是 2**31?
-
据我所知,在 c 中,int 2^15-1 和 long 2^31-1 的最大范围,不是吗? @TomKarzes
-
@MahediSabuj 通常这仅适用于 16 位系统。我猜 OP 在 32 位或 64 位系统上运行。 C 没有定义范围(它只给出最低要求的范围)。你为什么不自己试试呢?尝试查看
sizeof(int)。如果它是 4(或更大),那么它应该能够处理 +/- 20 亿。
标签: c dynamic-programming memoization