动态规划—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实现代码:
说一下解决的思路,那就是我们建立一个容量数组,该数组长度为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]; } }
相关文章推荐
- Oracle系列之触发器
- 揭开演讲恐惧的五大“秘密”
- 高仿微信对话列表滑动删除效果
- C++ Primer 学习笔记——类(二)
- 遥望布达拉——DAY10 巴塘-海通兵站
- C++笔记——类型兼容和多态
- Git版本控制常用命令
- Android属性动画深入分析:让你成为动画牛人
- 基于React实现项目中状态型变量的数据驱动可视化
- 为Python安装pip工具
- Android源码分析—属性动画的工作原理
- Android实战之 Jmail发送邮件(无需跳转到邮件客户端)
- OpenWrt配置opkg.conf
- Java邮件发送的简单实现
- bzoj3573: [Hnoi2014]米特运输
- c# sqlhelper
- STL_算法_查找算法(search_n)
- 课程设计--学生成绩管理
- java equals() 与‘==’区别
- NOIP2014 bzoj3751 Day2T3 解方程 数学&hash