我寫了一個JAVA程序,幾乎不需要3-4 MB的內存,但仍然超過了我提交判斷問題的分級程序的16 MB內存限制。JAVA內存超限問題
我有一個大小爲2500 * 100的整數二維數組,它佔用大約1MB,並且有一個最大爲2500個節點和2499條邊的相鄰列表(樹)。
它爲什麼超過16 MB的內存限制?我知道JAVA有一些開銷,但我仍然不明白爲什麼它超出了限制。如果有人能夠解釋爲什麼代碼會消耗這麼多內存的原因,那對我來說會非常有幫助。我也在做一個DFS,它會消耗一些堆棧內存,但沒有理由超過16 MB限制。
下面是代碼:
import java.io.*;
import java.util.*;
class CateringContracts2pi
{
static ArrayList<ArrayList<Integer>> adj = new ArrayList<ArrayList<Integer>>(2505);
static int mod = 10243;
static int ans=0;
static int dp[][]=new int[2501][101];
static int temp[]=new int[101];
static int N,K;
public static void main(String[]args)
{
Scanner sc = new Scanner(System.in);
for(int i=0;i<2505;i++)
adj.add(new ArrayList<Integer>());
N = sc.nextInt();
K = sc.nextInt();
for(int i=1;i<N;i++)
{
int u = sc.nextInt();
int v = sc.nextInt();
adj.get(u).add(v);
adj.get(v).add(u);
}
for(int i = 1; i <= N; i++)
{
dp[i][0] = dp[i][1] = 1;
}
dfs(1,0);
System.out.println(ans);
}
static void dfs(int node,int par)
{
int sz = adj.get(node).size();
for(int i=0;i<sz;i++)
{
int next = adj.get(node).get(i);
if(next==par)continue;
dfs(next,node);
Arrays.fill(temp,0);
for(int j=1;j<=K;j++)
{
for(int k=1;k+j<=K;k++)
{
temp[j+k]+=dp[node][j]*dp[next][k] % mod;
}
}
for(int j=1;j<=K;j++)
{
dp[node][j] += temp[j];
dp[node][j] %= mod;
}
}
ans+=dp[node][K];
ans%=mod;
}
}
不要張貼鏈接到代碼。在問題中發佈相關代碼本身。 – 2015-04-06 07:40:44
什麼是System.in值? N = sc.nextInt();是無限的,所以它可以容易地超過16MB取決於輸入。 – Vladp 2015-04-06 07:41:24
你能說說Vladp嗎? N是1-2500之間的整數。要點注意JB Nizet – 2015-04-06 08:15:42