【问题标题】:Knapsack Solution in Scala With Memoization带有记忆化的 Scala 中的背包解决方案
【发布时间】:2017-05-30 11:08:34
【问题描述】:

您好,我正在尝试使用 Memoization 在 Scala 中实现背包解决方案。这是没有记忆的代码

// knapsack = maxWeight: Int, weights: List[Int], values: List[Int]
val knapsack: ((Int, List[Int], List[Int]) => Int) = Memo {
     case (0, _, _) | (_, Nil, _) | (_, _, Nil) => 0
     case (weight, headWt :: tailWts, _ :: tailVals) if headWt > weight => 
                                       knapsack(weight, tailWts, tailVals)
     case (weight, headWt :: tailWts, headVal :: tailVals) => math.max(
                                       headVal+knapsack(weight-headWt, tailWts, tailVals),
                                       knapsack(weight-headWt, tailWts, tailVals))  
}

println(knapsack(50, weights.sortBy(-_), values.sortBy(-_)))

这是备忘录的定义:

case class Memo[A,B](f: A=>B) extends mutable.HashMap[A,B]{
     override def apply(a: A):B = {
          getOrElseUpdate(a, f(a))
     }
}

但是,我得到一个编译时错误:

  Type mismatch, expected: List[Int], actual: List[Any] 

如果我删除备忘录,它会正常工作。

谢谢。

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    我不确定你在哪一行得到错误

    类型不匹配,预期:List[Int],实际:List[Any]

    如果我将 knapsack 的类型更改为 (((Int, List[Int], List[Int])) => Int),即 Function1 从元组 (Int, List[Int], List[Int]) 更改为 Int,则您的带有 Memo 的代码将为我编译而不会出现任何错误。

    // knapsack = maxWeight: Int, weights: List[Int], values: List[Int]
    val knapsack: (((Int, List[Int], List[Int])) => Int) = Memo {
      case (0, _, _) | (_, Nil, _) | (_, _, Nil) => 0
      case (weight, headWt :: tailWts, _ :: tailVals) if headWt > weight =>
        knapsack(weight, tailWts, tailVals)
      case (weight, headWt :: tailWts, headVal :: tailVals) => math.max(
        headVal + knapsack(weight - headWt, tailWts, tailVals),
        knapsack(weight - headWt, tailWts, tailVals))
    }
    
    val weights: List[Int] = List(10, 20, 30)
    val values: List[Int] = List(2, 3, 4)
    println(knapsack(50, weights.sortBy(-_), values.sortBy(-_)))
    

    产生预期

    7

    【讨论】:

    • 非常感谢 SergGr 的帮助。不知道为什么会这样。从编译器错误消息中获取它是如此困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2018-10-07
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多