您的位置:首页 > 其它

动态规划—01背包问题

2015-12-24 21:16 232 查看
小偷的背包容量是16,5件物品的每件大小是:3, 4, 7, 8, 9;对应的价值是:4, 5, 10, 11, 13,如何小偷如何选择物品使偷得的总价值最高:

说一下解决的思路,那就是我们建立一个容量数组,该数组长度为17,对应索引为0-16,也就是代表从背包容量为0开始,一直到背包的最大容量16,每次对其赋值赋成价格的最优值。每次保持最优,那么结果就是最优。下面我们来看js实现代码:

var bagSize = 16,
weights = [3, 4, 7, 8, 9],
values = [4, 5, 10, 11, 13],
len = values.length,
maxPrice, i, j,
curSize = bagSize,
answers = Array();
result = Array(len);
// 初始化矩阵
for (i = 0; i < len; i++) {
result[i] = new Int8Array(bagSize + 1);
}
// 循环填充矩阵
for (i = 0; i <= bagSize; i++) {
for (j = 0; j < len; j++) {
if (weights[j] > i) {
// 物品重量大于背包重量时
if (j === 0) {
result[j][i] = 0;
}   else {
result[j][i] = result[j - 1][i];
}
} else {
if (j === 0) {
result[j][i] = values[j];
} else {
result[j][i] = Math.max(result[j - 1][i], result[j - 1][i - weights[j]] + values[j]);
}
}
}
}
maxPrice = result[len - 1][bagSize];
// 取出拿了哪个物品
for (i = len - 1; i >= 0 && curSize !== 0; i--) {
if (result[i][curSize] - result[i - 1][curSize - weights[i]] === values[i]) {
answers.push(weights[i]);
curSize -= weights[i];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: