广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现动态规划背包问题
  • 893
分享到

Java实现动态规划背包问题

2024-04-02 19:04:59 893人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一、原理1.1 最优子结构性质1.2 递归关系二、算法描述2.1 算法描述2.2 图解2.3 构造最优解三、 0 − 1 0-1 0−1 背包问题相关

前言

给定 n n n 种物品和一个背包。物品 i i i 的重量是 w i wi wi,其价值为 v i vi vi,背包的容量为 c c c。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

一、原理

0 − 0 - 0− 1 1 1 背包问题是一个特殊的整数规划问题。

在这里插入图片描述

1.1 最优子结构性质

在这里插入图片描述在这里插入图片描述

1.2 递归关系

在这里插入图片描述

设所给 0 − 1 0-1 0−1 背包问题的子问题的最优值为 m(i,j),即 m(i,j)是背包容量为 j,可选择物品为 i,i+1,…,n 时 0-1背包问题的最优值。由 0-1背包问题的最优子结构性质,可以建立计算 m(i,j)的递归式如下:

在这里插入图片描述

在这里插入图片描述

二、算法描述

2.1 算法描述

在这里插入图片描述

伪代码:

在这里插入图片描述

2.2 图解

在这里插入图片描述

在这里插入图片描述

2.3 构造最优解

在这里插入图片描述
在这里插入图片描述


三、 0 − 1 0-1 0−1 背包问题相关题目

3.1 题目

已知有5个物体,它们的重量分别为:2,2,4,5,4,各物体的价值依次为6,3,5,4,6,背包大小为10,使用动态规划法求矩阵m[i][j],并给出最优解。修改数据为:5个物体,它们的重量分别为:1,1,2,3,2,各物体的价值依次为6,3,5,4,6,背包大小为6,使用动态规划法求矩阵m[i][j],并给出最优解

3.2 源程序(Java求解 0 − 1 0-1 0−1背包问题)



public class E3_9 {
    //物品的个数+1(第一个数我写成0)
    static int N = 6;
    //static int C = 7;
    static int C = 11;
    
    public static void main(String[] args) {
        //int n = N-1;
        //背包的容量
        int c = C-1;
        int i;
        //物体的重量
        //int w[] = new int[N];
        int w[] = new int[]{0,2,2,4,5,4};
        //int w[] = new int[]{0,1,1,2,3,2};
        //物体的价值
        //int v[] = new int[N];
        int v[] = new int[]{0,6,3,5,4,6};
        //动态规划法求解过程的矩阵
        int m[][] = new int[N][C];
        //选择的结果
        int x[] = new int [N];

        // for (i = 1; i < N; i++) {
        //     w[i] = 1+(int) (Math.random()*5);
        //     v[i] = 1+(int) (Math.random()*10);
        // }

        knapsack(v,w,c,m);
        traceback(m,w,c,x);

        System.out.printf("背包能装的最大价值为:"+"%d  \n ",m[1][c]);
        for (i = 1; i <= c; i++) {
            System.out.printf("%2d  \t",i);
        }
        System.out.printf("重量 价值\n");

        for (i = 1; i < N; i++) {
            System.out.printf("%d:",i);
            for (int j = 1; j <= c; j++) {
                System.out.printf("%2d  \t",m[i][j]);
            }
            System.out.printf("%2d%4d\n",w[i],v[i]);
        }
        System.out.printf("\n\n物品的重量");
        for (i = 1; i < N; i++) {
            System.out.printf("%2d   \t",w[i]);
        }
        System.out.printf("\n物品的价值");
        for (i = 1; i < N; i++) {
            System.out.printf("%2d   \t",v[i]);
        }
        System.out.printf("\n选择的结果");
        for (i = 1; i < N; i++) {
            System.out.printf("%2d   \t",x[i]);
        }
        System.out.printf("\n");
    }

    
    public static void knapsack(int []v,int []w,int c,int [][]m){
        int n=v.length-1;
        int jMax=Math.min(w[n]-1,c);
        for(int j=0;j<=jMax;j++)  m[n][j]=0;
        for(int j=w[n];j<=c;j++)  m[n][j]=v[n];
        for(int i=n-1;i>0;i--){
            jMax=Math.min(w[i]-1,c);
            for(int j=0;j<=jMax;j++)
                m[i][j]=m[i+1][j];
            for(int j=w[i];j<=c;j++)
                m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
        }
        //m[1][c]=m[2][c];
        //对于i=1时的两种情况
        if(c>=w[1])
            m[1][c]=Math.max(m[2][c],m[2][c-w[1]]+v[1]);
        else
            m[1][c]=m[2][c];
    }

    
    public static void traceback(int [][]m,int []w,int c,int []x){
        int n=w.length-1;
        for(int i=1;i<n;i++)
            if(m[i][c]==m[i+1][c])
                x[i]=0;
            else {
                x[i]=1;
                c-=w[i];
            }
        x[n]=(m[n][c]>0)?1:0;
    }
}

3.3 运行结果

在这里插入图片描述

在这里插入图片描述


总结

动态规划基本步骤

  • 找出最优解的性质,并刻划其结构特征。
  • 递归地定义最优值。
  • 以自底向上的方式计算出最优值。
  • 根据计算最优值时得到的信息,构造最优解。

到此这篇关于Java实现动态规划背包问题的文章就介绍到这了,更多相关java动态规划内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现动态规划背包问题

本文链接: https://www.lsjlt.com/news/128711.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现动态规划背包问题
    目录前言一、原理1.1 最优子结构性质1.2 递归关系二、算法描述2.1 算法描述2.2 图解2.3 构造最优解三、 0 − 1 0-1 0−1 背包问题相关...
    99+
    2022-11-12
  • java背包问题动态规划算法分析
    背包问题 【题目描述】 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,C...
    99+
    2022-11-12
  • 【动态规划】背包问题(详细总结,很全)
    【动态规划】 一、 背包问题1. 背包问题总结1)动规四部曲:2) 递推公式总结:3) 遍历顺序总结: 2. 01背包1) 二维dp数组代码实现 2) 一维dp数组代码实现 ...
    99+
    2023-09-09
    动态规划 算法 python leetcode
  • C语言动态规划之背包问题详解
    01背包问题        给定n种物品,和一个容量为C的背包,物品i的重量是w[i],其价值为v[i]。问如何选择装入背包的物品,使得装入背...
    99+
    2022-11-12
  • C++动态规划中关于背包问题讲解
    目录一、分割等和子集-最后一块石头的重量II二、目标和三、一和零四、零钱兑换II五、排列与组合组合总数IV(排列问题)零钱兑换(组合问题) 一、分割等和子集-最后一块石头的重量II ...
    99+
    2023-03-15
    C++动态规划背包问题 C++动态规划 C++背包问题
  • Java使用动态规划算法思想解决背包问题
    目录动态规划算法动态规划算法的思想最优性原理动态规划算法的三大特点动态规划算法中的0/1背包问题动态规划算法的优点小结动态规划算法 动态规划算法的思想 动态规划算法处理的对象是多阶段...
    99+
    2022-11-13
  • Python算法题解:动态规划解0-1背包问题
    概述背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给...
    99+
    2023-06-02
  • C++动态规划中关于背包问题怎么解决
    本篇内容主要讲解“C++动态规划中关于背包问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++动态规划中关于背包问题怎么解决”吧!一、分割等和子集-最后一块石头的重量II背包问题,难...
    99+
    2023-07-05
  • python 动态规划问题解析(背包问题和最长公共子串)
    目录背包问题最长公共子串背包问题 现在要往一个可以装4个单位重量的背包里怎么装价值最高:A重量1个单位,价值15;B重量3个单位,价值20;C重量4个重量,价值30 使用动态规划填充...
    99+
    2022-11-13
  • C语言动态规划多种背包问题分析讲解
    目录写在前面01背包问题完全背包问题多重背包问题 I多重背包问题 II为什么可以这样优化呢一 、二进制与十进制二 、动态规划的时间复杂度估算三 、多重背包分组背包问题写在前面 之前讲...
    99+
    2022-11-13
  • C语言动态规划多种背包问题怎么解决
    这篇文章主要介绍了C语言动态规划多种背包问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态规划多种背包问题怎么解决文章都会有所收获,下面我们一起来看看吧。01背包问题C语言数学问题与简单DP0...
    99+
    2023-06-30
  • 动态规划之什么是多重背包
    本篇内容主要讲解“动态规划之什么是多重背包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“动态规划之什么是多重背包”吧!多重背包有N种物品和一个容量为V 的背包。...
    99+
    2022-10-19
  • Java动态规划之硬币找零问题实现示例
    目录问题描述:问题分析:具体的过程如下:动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20...
    99+
    2022-11-13
    Java 硬币找零
  • Java动态规划之硬币找零问题实现代码
    动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就可以直接取出这些已经计算过的解而免去重复运算。保存子问题的解可以使用填表方式,例如保存在数...
    99+
    2023-05-30
    java 算法 硬币找零
  • Java动态规划之丑数问题实例讲解
    问题描述: 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 注: 1也是丑数 思路: 我们来分析一下丑数如何得到,肯...
    99+
    2022-11-13
  • Java动态规划之如何编辑距离问题
    这篇文章给大家分享的是有关Java动态规划之如何编辑距离问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所...
    99+
    2023-05-30
    java
  • Java矩阵连乘问题(动态规划)算法实例分析
    本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连...
    99+
    2023-05-30
    java 矩阵 算法
  • 动态规划之矩阵连乘问题Python实现方法
    本文实例讲述了动态规划之矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积...
    99+
    2022-06-04
    矩阵 方法 动态
  • 如何实现动态规划进阶
    本篇内容介绍了“如何实现动态规划进阶”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!案例 1问:给定一个包含非负整数的 m x n 网格,请找...
    99+
    2023-06-15
  • C++实现动态规划过程详解
    目录C++实现动态规划1. 动态规划的基础2. 动态规划的实现方法3. 实际应用C++实现动态规划 动态规划是解决一类最优问题的常用方法,它是解决最优化问题的一种途径,因为这种算法通...
    99+
    2023-05-20
    C++实现动态规划 C++动态规划
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作