2015-04-06 65 views
0

我寫了一個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; 
} 

}

+4

不要張貼鏈接到代碼。在問題中發佈相關代碼本身。 – 2015-04-06 07:40:44

+0

什麼是System.in值? N = sc.nextInt();是無限的,所以它可以容易地超過16MB取決於輸入。 – Vladp 2015-04-06 07:41:24

+0

你能說說Vladp嗎? N是1-2500之間的整數。要點注意JB Nizet – 2015-04-06 08:15:42

回答

-1

JVM本身設置多少內存將使用。以下是一些可以幫助您的提示:How is the default java heap size determined?。您可以嘗試使用諸如-Xmx,-Xms等標誌來減少已用內存的數量。

+0

你能詳細說一下嗎? – 2015-04-06 08:07:19

+0

在您發送的鏈接上,有些答案指出默認堆大小爲4 MB,而另一些則表示其1 GB的1/64或其他內容。在後一種情況下,我不可能接受任何Java代碼。 – 2015-04-06 08:08:10

+0

設置的數量取決於許多因素:jvm版本,總物理內存量等。嘗試運行一些限制的應用程序,例如:java -Xmx6m -Xms4m CateringContracts2pi。如果遇到內存不足錯誤,請增加值 – jaroslawj 2015-04-06 08:13:29