【动态规划】0-1背包问题原理和实现
2019-02-25 16:10:49来源:博客园 阅读 ()
- 0 1背包——每种物品只能选0件或者1件
/** * weight[] = {2,3,4,5} * value[] = {3,4,5,7} * 求解满足小于背包最大承重得到最大价值的物品存放策略 * 思路核心: * 1. 当前取物品的重量weight[i-1] <= j 当前能取最大重量 * 2. 比较价值:不放这个物品的最高价值 和 放入此物品的最高价值 * maxValue[i-1][j] 不放这个物品的最高价值 * value[i-1] + maxValue[i-1][j-weight[i-1]] 当前物品价值 + 放入当前物品的前i-1个物品的最高价值 * ------------------------------------------------------- * | i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | * ------------------------------------------------------- * | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | * ------------------------------------------------------- * | 1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | * ------------------------------------------------------- * | 2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 | 7 | * ------------------------------------------------------- * | 3 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 | 12 | * ------------------------------------------------------- * | 4 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 10| 11| 12 | * ------------------------------------------------------- * eg: * i=3,j=2; * weight[3-1] = 4 > j -----> maxValue[3-1][2] = maxValue[2-1][2] = 3 * * i=3,j=4; * weight[3-1] = 4 <= j 成立 * maxValue[3-1][4] = 4 不放这个物品的最高价值 * value[3-1] + maxValue[2][4-4] =5 + 0 = 5 > 4 当前物品价值 + 放入当前物品的前i-1个物品的最高价值 */ public static int getMaxValue(int[] weight, int[] value, int maxWeight) { int n = weight.length;//物品数目 // 定义最大价值二维数组,从0开始,各维度需加一个长度 int[][] maxValue = new int[n + 1][maxWeight + 1]; // 最大重量和物品数为0,价值为0 for (int w = 0; w < maxWeight + 1; w++) { maxValue[0][w] = 0; } for (int i = 0; i < n + 1; i++) { maxValue[i][0] = 0; } // 只拿前i件物品(最大价值从0开始,对应的weight和value取i-1) for (int i = 1; i <= n; i++) { for (int j = 1; j <= maxWeight; j++) { // 先假定当前物品的最大价值等于放上一件的最大价值 maxValue[i][j] = maxValue[i - 1][j]; // 当前物品的重量小于等于总重量 if (weight[i - 1] <=j) { // 比较 不放这个物品的最高价值 和 放入此物品的最高价值 if (value[i - 1] + maxValue[i - 1][j - weight[i - 1]] > maxValue[i - 1][j]) { maxValue[i][j] = value[i - 1] + maxValue[i - 1][j - weight[i - 1]]; } } } } return maxValue[n][maxWeight]; } public static void main(String[] args){ int weight[]={2,3,4,5}; int value[]={3,4,5,7}; int maxWeight=9; System.out.println(getMaxValue(weight,value,maxWeight)); }
原文链接:https://www.cnblogs.com/bloghxr/p/10422485.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:使用zxing二维码识别
下一篇:Java数组协变与范型不变性
- 小白之旅30-1 2019-08-16
- 2018-10-19 00:13:35 ArrayList 2018-10-19
- 读书笔记之《程序员代码面试指南(递归和动态规划)》 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash