题目描述:给定n种物品和一背包,物品i的重量是w[i],其价值为v[i],背包的容量为total,问应该如何选择装入背包的物品,使得装入背包中物品的总价值bestVal最大。
基本思想:把问题的解空间转换成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历过程中记录和寻找所有可行解或者最优解。基本思想类似于图的深度优先搜索和二叉树的后序遍历。
var n = 3, //物品数量
total = 16; // 背包允许放入的总重量
w = [10, 8, 5], // 每种物品的重量
v = [5, 4, 1], // 每种物品的权值
x = [0, 0, 0], // 当前的每种物品是否放入背包
curWeight = 0, // 当前放入背包的物品总重量
curVal = 0, // 当前放入背包的物品总权值
bestVal = 0, //
bestX = [0, 0, 0] //
function backTrack(t) {
if(t > n - 1) {
if(curVal > bestVal) {
bestVal = curVal
for(let i = 0; i < 3; i ++) {
bestX[i] = x[i]
}
}
} else {
if(curWeight + w[t] <= total) {
x[t] = 1
curVal += v[t]
curWeight += w[t]
backTrack(t+1)
curWeight -= w[t]
curVal -= v[t]
}
x[t] = 0
backTrack(t+1)
}
}