0
嗨我试图在Memoization中实现Scala中的Knapsack解决方案。这里是没有记忆化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]
如果我删除备注它的工作原理精细。
谢谢。
非常感谢SergGr您的帮助。不知道为什么它发生。从编译器错误消息中获取它是如此困难的事情。 – aks