Java采用动态规划思想解决背包问题
Posted Android上下而求索
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java采用动态规划思想解决背包问题相关的知识,希望对你有一定的参考价值。
动态规划的定义
动态规划(Dynamic Programming)是运筹学的一个分支,是求解决策过程(Decision Process)最优化的数学方法。
动态规划的意义就是通过分而治之的策略,通过解决大问题的子问题从而解决整体的做法。
动态规划的核心思想是巧妙的将问题拆分为多个子问题,通过计算子问题而得到整体问题的解。
动态规划的解题核心
状态的定义
有的问题过于抽象,我们需要将题干中的问题进行转化。转化为一系列同类问题的某个解的情况。状态转移方程的定义
关注点在于:如何能够用前一项或者前几项的信息得到下一项,从最优子状态转化为下一个最优状态
背包问题
在N件物品中取出若干件放在容器为W的背包中,每件物品的体积为W1,W2,…Wn(Wi为整数),与之相对应的价值为P1,P2,…Pn(Pi为整数)。求背包所能容纳的最大价值。
问题分析
假设DP[i][j]表示用i件物品,体积为j的情况下所能容纳的价值
对于第i件物品,如果i物品的体积Wi > j, 则表示无法放入背包,生成方程式: DP[i][j] = DP[i-1][j]
如果第i件物品的体积Wi < j, 则会有两种情况,a:将i物品放入背包,生成方程式: DP[i][j] = DP[i-1][j-W1] + Pi; b:不放入背包,生成方程式: DP[i][j] = DP[i-1][j]。最终求最大价值方程式为: Math.max(DP[i-1][j-W1]+Pi, DP[i-1][j])。
示例
物品数量: n = 5
背包的总体积: _w = 10
物品的体积: w = {3,5,1,2,4}
物品的价值: p = {19,400,45,67,23}
public static void bagValue() {
int n = 5;
int _w = 10;
int[] w = {3,5,1,2,4};
int[] p = {19,400,45,67,23};
int[][] DP = new int[n][_w+1];
for(int i = 0; i < n; i++){
for(int j = 0 ; j <= _w; j++){
if(i == 0 || j == 0){
DP[i][j] = 0;
}else{
if(j < w[i]){
DP[i][j] = DP[i-1][j];
}else{
DP[i][j] = Math.max(DP[i-1][j - w[i]] + p[i] , DP[i-1][j]);
}
}
System.out.println("dp"+"["+i+"]"+"["+j+"]"+DP[i][j]);
}
}
}
参考
[1] https://blog.csdn.net/QuinnNorris/article/details/77484573
[2] https://blog.csdn.net/qq_22222499/article/details/71017501
下面的是我的公众号二维码图片,欢迎关注
以上是关于Java采用动态规划思想解决背包问题的主要内容,如果未能解决你的问题,请参考以下文章
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 15 背包问题
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 15 背包问题