MoonBit Pearls Vol.03:01背包问题

01背包问题是算法竞赛中经典的dp题目。文中总共包含五个版本的代码。从最朴素的枚举法开始,在不断的改进下,最终变成了dp解法。
问题定义
有若干个物品,每件物品的有重量weight和价值value:
struct Item {
weight : Int
value : Int
}
现在,给定一个物品列表items,和背包的容量capacity。从中选出若干件物品,使得这些物品的总重量不超过背包的容量,且物品的总价值最大。
typealias @list.T as List
let items_1 : List[Item] = @list.of([
{ weight: 7, value: 20 },
{ weight: 4, value: 10 },
{ weight: 5, value: 11 },
])
以上面的items_1为例,假设背包容量是,那么最优的方案是选取后两个物品,占用的容量,总共有点价值。
注意,由于我们不能把物品切割,因此优先挑选性价比最高的物品并非正解。例如,在上面的例子中,若选取了性价比最高的物品1,则只有点价值,而此时背包已经放不下其他物品了。