Java采用动态规划思想解决背包问题

Posted Android上下而求索

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java采用动态规划思想解决背包问题相关的知识,希望对你有一定的参考价值。

动态规划的定义

  1. 动态规划(Dynamic Programming)是运筹学的一个分支,是求解决策过程(Decision Process)最优化的数学方法。

  2. 动态规划的意义就是通过分而治之的策略,通过解决大问题的子问题从而解决整体的做法。

  3. 动态规划的核心思想是巧妙的将问题拆分为多个子问题,通过计算子问题而得到整体问题的解。

动态规划的解题核心

  1. 状态的定义  
    有的问题过于抽象,我们需要将题干中的问题进行转化。转化为一系列同类问题的某个解的情况。

  2. 状态转移方程的定义  
    关注点在于:如何能够用前一项或者前几项的信息得到下一项,从最优子状态转化为下一个最优状态

背包问题

在N件物品中取出若干件放在容器为W的背包中,每件物品的体积为W1,W2,…Wn(Wi为整数),与之相对应的价值为P1,P2,…Pn(Pi为整数)。求背包所能容纳的最大价值。

问题分析
  1. 假设DP[i][j]表示用i件物品,体积为j的情况下所能容纳的价值

  2. 对于第i件物品,如果i物品的体积Wi > j, 则表示无法放入背包,生成方程式: DP[i][j] = DP[i-1][j]

  3. 如果第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

下面的是我的公众号二维码图片,欢迎关注
图注:android上下而求索


以上是关于Java采用动态规划思想解决背包问题的主要内容,如果未能解决你的问题,请参考以下文章

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 15 背包问题

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 15 背包问题

动态规划之01背包问题(含代码C)

学习数据结构笔记(17) --- [动态规划(由背包问题引入)]

动态规划基本思想

动态规划算法实现部分——0/1背包问题