动态规划——0/1背包问题(全网最细+图文解析)「建议收藏」

动态规划——0/1背包问题(全网最细+图文解析)「建议收藏」01背包你真的掌握了吗?进来带你10分钟秒杀

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

✨动态规划——0/1背包问题(全网最细+图文解析)


作者介绍:

?作者:青花瓷✨
?作者的Gitee:代码仓库
?系列文章推荐:
✨1.数据结构与算法—算法篇之动态规划(一)
✨2.【Java刷题特辑第一章】——【点进来花两把游戏的时间学习晚上睡觉都踏实了】
✨3.【Java刷题特辑第二章】—— 这些经典笔试题,你确定都做过吗?
✨✨我和大家一样都是热爱编程✨,很高兴能在此和大家分享知识,希望在分享知识的同时,能和大家一起共同进步,取得好成绩?,今天和大家分享的章节是动态规划——0/1背包问题(全网最细+图文解析)
,如果有错误❌,欢迎指正哟?,咋们废话不多说,跟紧步伐,开始学习吧~?

在这里插入图片描述


前言:

背包问题是一个很经典的动态规划问题,这一篇博客采取图文解析的方式,帮助你更好的理解,废话不多说,我们开始学习吧✨?


0/1背包问题

一 题目描述:

有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

为了方便讲解和理解,下面讲述个例子:
在这里插入图片描述

二 总体思路:

根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现。

如果对动态规划解题思路以及步骤和如何推导转移方程还不清楚的同学可以去看一下我前面发的一篇DP大总结希望能够帮到你:数据结构与算法—算法篇之动态规划(一)

三 动态规划的原理:

动态规划方法的原理就是把多阶段决策过程转化为一系列的单阶段决策问题,利用各个阶段之间的递推关系,逐个确定每个阶段的最优化决策,最终堆叠出多阶段决策的最优化决策结果。

解题思路

首先我们先来推导,找一下递推关系和状态转移方程:
在这里插入图片描述
很显然这道题的状态转移方程:

为了方便理解 这里 W代表物品的重量(背包容量),V代表物品的价值,f(k,w)代表:当背包容量为w,现有K件物品可以装,所能偷到的最大价值

在这里插入图片描述
填表,首先初始化边界条件,然后一行一行的填表:
根据前面的推导,这个表格很容易就能填,我们只需要把对应的价值填上去就行了
在这里插入图片描述

代码实现

/**
     * 0-1背包
     * @param val 价值
     * @param weight 重量
     * @param W 背包容量
     * @return 最优解
     */
    public static int func(int[] val, int[] weight, int W) {
        int N = weight.length;   //记录所有的物品数
        int[][] V = new int[N + 1][W + 1];  //创建背包矩阵
        //初始化矩阵 列,背包容量为0
        for (int col = 0; col <= W; col++) {
            V[0][col] = 0;
        }
        for (int row = 0; row <= N; row++) {
            V[row][0] = 0;
        }
        for (int i = 1; i <= N; i++) {  //一行一行填充值
            for (int j = 1; j <= W; j++) {  //一列一列填充值
                if (weight[i - 1] <= j) {  //如果当前物品重量小于等于背包中的当前重量 i为1是,weight[0]是第一个物品的重量
                    //比较不加入该物品时该重量的最大价值(前一行)与当前物品的价值+可以容纳的剩余重量的价值
                    V[i][j] = Math.max(val[i-1] + V[j-1][j - weight[i-1]],V[i-1][j]);
                } else { //如果当前物品重量大于背包中的当前重量
                    V[i][j]=V[i-1][j];  //直接使用前一行的最优解
                }
            }
        }
        /*打印矩阵
        for (int[] rows: V) {
            for (int col : rows) {
                System.out.format("%5d",col);
            }
            System.out.println();
        }*/
        return V[N][W];

    }

✨?总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”

如果有错误❌,欢迎指正哟?

?如果觉得收获满满,可以动动小手,点点赞?,支持一下哟?
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164402.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 墙裂推荐9个在线图片压缩网站[通俗易懂]

    墙裂推荐9个在线图片压缩网站[通俗易懂]转载自:https://www.zcool.com.cn/article/ZNTQzNDYw.html?switchPage=on1.Tinypng网址:https://tinypng.com/Tinypng可以说是很受大家欢迎的一个图片压缩站点,不管对于前端工程师或者设计师来说都是一个不错的图片压缩工具。Tinypng的操作方式也十分的简单,上传、压缩、下载,流程十分的简单,网站不仅仅支…

    2022年6月18日
    33
  • html里制作简单导航栏

    html里制作简单导航栏今天简单的做了一下网页里的导航栏。效果如下:代码: 实验3 ul{/*设置导航栏的框框*/ margin:30pxauto;/*框框整体的位置,30px是指离网页的顶部和下部的距离,auto控制的是左右距离为自动调节*/ width:600px;/*框框的宽度*/ height:350px;/*框框的长度*/ pad

    2022年5月28日
    53
  • CSS使图片变模糊,亲测非常好用「建议收藏」

    CSS使图片变模糊,亲测非常好用

    2022年2月15日
    36
  • SMART S7-200PLC流量累计算法实现(梯形图算法详解+优化)

    SMART S7-200PLC流量累计算法实现(梯形图算法详解+优化)流量累计基于积分的原理,采用细分面积的方法近似计算瞬时流量的累加。也是离散上的累加求和,公式虽然简单但是流量累计仍有些需要注意的地方,下面一一和大家举例说明。

    2025年10月20日
    2
  • 安防监控系统的几个基础小知识

    安防监控系统的几个基础小知识  问题一:摄像机装多高?  我在和客户沟通的时,很多时候都建议客户室内不低于2.5米,室外不低于3.5米,这些数字虽然简单但考虑到了室内的高度及镜头下压的角度,也考虑到了室外安装时照射的长度及防人为破坏的因素。  问题二:支架安装有何建议?  在装摄像机的时候都会有壁装和吊装两种选择,超市等室内环境吊装比较多,室外一般选择壁装。一般轻巧些的机器比如中维世纪的JVS-N81-HY用04、05…

    2022年6月28日
    24
  • ettercap的使用帮助文档 官方man page的个人理解

    ettercap的使用帮助文档 官方man page的个人理解原英文的帮助文档可以在http://linux.die.net/man/8/ettercap查看或者在安装有ettercap的Linux终端输入”manettercap”查看多数以我自己的理解的方式翻译,不是很理解的地方翻译过来的可能会有很多不对的地方如果对我翻译的内容有不一样的看法,欢迎交流。Nameettercap0.7.5-Amultipurposesniffer/co

    2022年6月28日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号