2016-11-18 73 views
0

我想解决使用动态规划的Scala中的背包问题。作为需求的一部分,我还需要显示哪些项目被挑选填充到Knapsack.But中,但我得到“ArrayIndexOutOfBoundException”。 到目前为止我有什么代码如下:Knapsack中的ArrayIndexOutofBoundsException Scala

availableMoney is equivalent to weight of knapsack.products.channels is equivalent to value[] in knapsack.products.price is equivalent to weight[] in knapsack. 

def knapSack(availableMoney: Int, products: List[Product]) : Int = { 
    var wt = List[Int](products.length) 
    var value = List[Int](products.length) 
    for (product <- products) { 
     value ::= product.channels.length 
     wt ::= product.price 
    } 

    val matrix = Array.fill(2, 2)(0) 
    val picks = Array.fill(2, 2)(0) 


    for (i <- 1 to products.length){ 
     for (j <- 0 to availableMoney){ 
      if (wt(i-1)<=j){ 
       matrix(i)(j) = max(matrix(i-1)(j),value(i-1)+matrix(i-1)(j-wt(i-1))); 
       if (value(i-1)+matrix(i-1)(j-wt(i-1))>matrix(i-1)(j)) 
        picks(i)(j)= 1; 
       else 
        picks(i)(j)= -1; 
      } 
      else{ 
       picks(i)(j) = -1; 
       matrix(i)(j) = matrix(i-1)(j); 
      } 
     } 
    } 

    matrix(products.length)(availableMoney) 

} 
+1

你在哪里得到例外? – Carcigenicate

+1

'for(i < - 1 to products.length)'应该可能是'for(i < - 1 to(products.length - 1))'。我不记得一个范围内的最大值是否是唯一的。 – Carcigenicate

+1

运算符'to'是Range.Inclusive,而'until'是Range.Exclusive。如果您使用IDE并将鼠标悬停在这些运算符上,则会看到说明(包含/排除)。所以它可能应该是'直到products.length' – radumanolescu

回答

0

有几个问题我想:

  • Ĵ从0到availableMoney运行,然后作为索引picksmatrix已经初始化为特定尺寸,因此,如果超过availableMoney这些尺寸,它将失败
  • i从1运行至products.length但也用于作为一个指数到picksmatrix,所以会错过0并且如果存在一个重新获得比第二维尺寸更多的产品,则会失败

使用一些println调试来更仔细地检查发生了什么。看起来像一个有趣的算法。一旦你得到它的工作,发布我们的解决方案:)