(基于Java)算法之动态规划——0-1背包问题
2014-04-27 19:43
591 查看
动态规划的定义不解释,请读者移步到本博“最大K乘积问题”的博文中。
0-1背包问题描述:给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中的物品的总价值最大?
在本篇博文中,我将介绍如何用动态规划的方法来解决该问题。
首先,我们要找出原问题的最优子结构性质:
设x{x1,x2,x3......xn-1,xn}是最优解.
则x'{x2,x3,x4.......xn-1,xn}是子问题的最优解。
准备工作:
变量c用来表示背包的容量,变量n用来表示物品个数
一维数组w[],v[],分别用来存储物品i的重量和价值,为了方便第i个物品对应下标i,新建数组时可把数组长度设定为n+1
二维数组m[][],用来存储每个子问题的最优解,该二维数组的行列数最少都要n行c+1列(物品n个,重量c,算上0的话,一共c+1),为了方便第i个物品对应下标i,行数可以定义成n+1
解决方法:
解决办法是用自底向上的填表法。
先看看这个问题的递归方程:
下面我贴出填表法的代码
如有不对的地方或更好的建议,欢迎评论留言!
0-1背包问题描述:给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中的物品的总价值最大?
在本篇博文中,我将介绍如何用动态规划的方法来解决该问题。
首先,我们要找出原问题的最优子结构性质:
设x{x1,x2,x3......xn-1,xn}是最优解.
则x'{x2,x3,x4.......xn-1,xn}是子问题的最优解。
准备工作:
变量c用来表示背包的容量,变量n用来表示物品个数
一维数组w[],v[],分别用来存储物品i的重量和价值,为了方便第i个物品对应下标i,新建数组时可把数组长度设定为n+1
二维数组m[][],用来存储每个子问题的最优解,该二维数组的行列数最少都要n行c+1列(物品n个,重量c,算上0的话,一共c+1),为了方便第i个物品对应下标i,行数可以定义成n+1
解决方法:
解决办法是用自底向上的填表法。
先看看这个问题的递归方程:
下面我贴出填表法的代码
public static int fun(int[] v, int[] w, int n, int c){ int[][] m = new int[n+1][c+1]; int i,j; int jMax = getMin(w[n-1],c); /* * 这个for循环和下一个for循环的目的是利用vi进行初始化, * 自己在张纸上手动填一下就知道为什么j的循环那么奇怪了。 */ for(j = 0; j<=jMax; j++) m [j] = 0; for(j = w ; j<=c; j++) m [j] = v ; /* * 在这个for循环中进行比较填入 */ for(i = n-1; i>=1; i--){ jMax = getMin(w[i]-1,c); for(j = 0; j<=jMax;j++) m[i][j] = m[i+1][j]; for(j = w[i]; j<=c; j++) m[i][j] = getMax(m[i+1][j],v[i]+m[i+1][j-w[i]]); } /* * 因为填表方法是自底向上填表,因此,当i=1时,m[1][c]内 * 填入的数就是原问题的解,先将第一个子问题的最优解(即m[2][c]) * 填入,以防用0来做下一步的比较,后边的比较应该能看懂吧~不多说了 */ m[1][c] = m[2][c]; if(c >= w[1]) m[1][c] = getMax(m[1][c],v[1]+m[2][c-w[1]]); return m[1][c]; }
如有不对的地方或更好的建议,欢迎评论留言!
相关文章推荐
- (基于Java)算法之动态规划——矩阵连乘问题
- (基于Java)算法之动态规划——矩阵连乘问题
- 基于C的动态规划0-1背包问题
- Java企业面试算法新得体会之4递归和动态规划问题17问
- (基于Java)算法之动态规划——最长公共子序列
- Java求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包动态规划问题求解)
- 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法
- 算法导论学习笔记(十三):动态规划(三):01背包问题
- 动态规划之背包问题01--java实现
- 动态规划之背包问题01——Java实现
- 算法竞赛宝典 动态规划 货币系统问题(完全背包+一维优化)
- 背包算法递归实现,递归转动态规划的一般方法java实现
- 算法 -- 0-1背包问题之动态规划
- 动态规划(背包问题)java实现
- 动态规划之背包问题01——Java实现
- 算法笔记:动态规划背包问题(未完待续)
- 基于动态规划的0-1背包问题
- 【算法】——动态规划之0-1背包问题
- 算法:动态规划解 0-1 背包问题
- 算法导论 第四部分——基本数据结构——第15章:动态规划:背包问题