动态规划:0-1背包问题 图文+举例超详细说明

一、题目描述

给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。
应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

输入格式:

共有n+1行输入:
第一行为n值和c值,表示n件物品和背包容量c;
接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。

输出格式:

输出装入背包中物品的最大总价值。

输入样例:

在这里给出一组输入。例如:

5 10
2 6
2 3
6 5
5 4
4 6

输出样例:

在这里给出相应的输出。例如:

15

二、解题思路

1、dp数组所代表的含义:dp[i] [j]代表从下标[0-i]的物品里任意取,放进容量为j的背包,最大价值为多少。

2、dp数组的递推公式:dp[i] [j] =max(dp[i-1] [j],dp[i-1] [j-weight[i]]+value[i]);

对于第i个物品,只有放入背包或者不放入背包两种情况,所以比较这两种情况的价值,取最大值。

①若第i个物品不放入背包:当前背包容量不改变。那么由dp数组的含义,说明从[0 - i-1]的物品任意取,放入容量为j的背包。即dp[i-1] [j];

②若第i个物品放入背包:那我们需要先将当前的背包容量j空出第i个物品的重量weight[i]  因为我们选择了把第i个物品装入背包,那么背包一定先要有第i个物品,所以容量减去weight[i]。再在此基础上来考虑任取[0 - i-1]物品装入剩余的背包容量中能取得的最大价值,由dp数组的含义可得dp[i-1] [j-weight[i]],而这种情况在我们考虑是否把第i-1个物品放入背包时已经被计算过并保存在了dp数组里了(如同现在考虑的第i个物品一样)。   于是,把第i个物品放入背包时的最大价值为:任取前i-1个物品放入背包容量为j-weight[i]的最大价值dp[i-1] [j-weight[i]]+第i个物品的价值value[i],即dp[i] [j-weight[i]]+value[i]

3、dp数组的初始化

dp数组的初始化需与dp数组的含义相吻合。

①当背包容量为0时,任何物品都无法装入背包,所以最大价值dp[i] [0]=0;

②由dp数组的递推公式:dp[i] [j] =max(dp[i-1] [j],dp[i-1] [j-weight[i]]+value[i]);可知,i是由i-1推导而来,所以i-1必须初始化。

当背包容量j小于物品0的重量weight[0]时,物品i无法放入背包,则dp[0] [j]=0;当j>=weight[0]时,物品i能放入背包,则dp[0] [j]=value[i];

假设物品0的weight[0]=2,value[0]=15。则此时的dp[i] [j]如下图:

③至于其他区域的dp[i] [j]的初始化其实无所谓,因为它们的数值都是由前面的数值推导而来,会被推导得到的数值覆盖。所以我们一般会初始化为0。

4、遍历顺序

dp数组为二维数组,所以给它赋值需有两重循环。先遍历物品还是先遍历背包容量都可以。因为由dp数组的递推公式:dp[i] [j] =max(dp[i-1] [j],dp[i-1] [j-weight[i]]+value[i])可知,所求dp[i] [j]的值由dp[i] [j]的左上角的值推导而来,无论先遍历物品还是先遍历背包容量,在求dp[i] [j]的值时,dp[i] [j]的左上角区域都已经正确赋值,可以动手推导试试。

5、举例推导dp数组

例:背包的最大容量为4。

物品为:

求背包能背的物品的最大价值。

三、代码

import java.util.Scanner;

public class KnapsackProblem {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //读取物品数量n和背包容量c
        int n=sc.nextInt();
        int c=sc.nextInt();

        //初始化物品重量和价值数组
        int weight[]=new int[n];
        int value[]=new int[n];

        // 读取每个物品的重量和价值
        for (int i = 0; i < n; i++) {
            weight[i] = sc.nextInt();
            value[i] = sc.nextInt();
        }

        //创建dp数组,大小为 n * (c+1),初始化为0
        int dp[][]=new int[n][c+1];

        //初始化只放入物品0的情况
        for (int j = weight[0]; j <= c; j++) {
            dp[0][j] = value[0];
        }

        // 填充dp数组
        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= c; j++) {
                if (j < weight[i]) {//此时物品重量比背包容量大,无法装入物品i
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
                }
            }
        }

        // 输出结果
        System.out.println(dp[n-1][c]);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实例:图片处理

目录 图片处理 Python代码展示 代码逐行注释 图片素材 运行结果 需要注意的几点&#xff1a; 运行思路 1. 导入必要的模块及类&#xff08;开头部分&#xff09; 2. 定义文件相似度检查函数&#xff08;file_similarity_checker 函数部分&#xff09; 3. 指定要比较的…

鸿蒙项目云捐助第四讲鸿蒙App应用的登陆注册页实现

根据app的操作流程可以知道&#xff0c;当启动页启动后&#xff0c;点击启动页中的页面就进入到了登录页。本讲就是针对于登录注册页的实现&#xff0c;实现的界面参考下图。 这里根据这个素材的参考实现鸿蒙Next云捐助的登录页。 一、鸿蒙Next云捐助登录页的实现 在项目中继…

大屏开源项目go-view二次开发1----环境搭建(C#)

最近公司要求做一个大屏的程序用于展示公司的产品&#xff0c;我以前也没有相关的经验&#xff0c;最糟糕的是公司没有UI设计的人员&#xff0c;领导就一句话要展示公司的产品&#xff0c;具体展示的内容细节也不知道&#xff0c;全凭借自己发挥。刚开始做时是用wpf做的&#x…

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…

操作系统的基本认识

操作系统的感性认识 操作系统这个词可能或多或少听说过&#xff0c;比如windows, linux, macOS。这些其实都是工程师们经过实践后的具象化产物。而操作系统原理这六个字就是操作系统的抽象化&#xff0c;更准确的说&#xff0c;操作系统原理是很理论化的东西。举一个不是很恰当…

强化学习Q-learning及其在机器人路径规划系统中的应用研究,matlab代码

一、Q-learning 算法概述 Q-learning 是一种无模型的强化学习算法&#xff0c;它允许智能体&#xff08;agent&#xff09;在没有环境模型的情况下通过与环境的交互来学习最优策略。Q-learning的核心是学习一个动作价值函数&#xff08;Q-function&#xff09;&#xff0c;该函…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…

分布式 Paxos算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Paxos算法 & 总结》《分布式 & Paxos算法 & 问题》 参考文献 《图解超难理解的 Paxos 算法&#xff08;含伪代码&#xff09;》《【超详细】分布式一致性协议 - Paxos》 Basic-Paxos 基础帕克索斯算法…

10.qml使用 shadereffect 实现高斯模糊

目录 高斯模糊sigma获取加权均值获取 高斯二维公式实现高斯一维公式实现使用总结 高斯模糊 高斯模糊应用领域我就不过多讲解&#xff0c;想了解自己去了解 高斯模糊有 一维公式 二维公式 当然我们图像是二维的 但是实际上二维公式用于计算那是消耗大量的算力的&#xff0c…

从 CephFS 到 JuiceFS:同程旅游亿级文件存储平台构建之路

随着公司业务的快速发展&#xff0c;同程旅行的非结构化的数据突破 10 亿&#xff0c;在 2022 年&#xff0c;同程首先完成了对象存储服务的建设。当时&#xff0c;分布式文件系统方面&#xff0c;同程使用的是 CephFS&#xff0c;随着数据量的持续增长&#xff0c;CephFS 的高…

相机测距原理

基础概念的回顾 焦距的定义 焦距是指透镜或镜头的光学中心&#xff08;通常是透镜的几何中心&#xff09;到其焦点的距离。 焦点是光线的交点&#xff0c;它指的是透镜或镜头聚焦所有入射光线后汇聚的位置。焦点的位置与透镜的曲率和光线的入射角度相关。就是说所有光线经过…

AOF和RDB【Redis持久化篇】

文章目录 1.什么是持久化&#xff1f;2.RDB3.AOF 1.什么是持久化&#xff1f; Redis是跑在内存里的&#xff0c;当程序重启或者服务器崩溃&#xff0c;数据就会丢失&#xff0c;如果业务场景希望重启之后数据还在&#xff0c;就需要持久化&#xff0c;即把数据保存到可永久保存…

2024-12-14 学习人工智能的Day35 卷积神经网络.阶段项目

卷积神经网络项目实现 关于项目实现的文档说明书&#xff0c;三个要素&#xff1a;数据、模型、训练 1、项目简介。 1.1 项目名称 ​ 基于CNN实现扑克牌花色的小颗粒度分类 1.2 项目简介 ​ 该项目旨在通过卷积神经网络&#xff08;CNN&#xff09;实现扑克的小颗粒度分类…

【鸿蒙实战开发】数据的下拉刷新与上拉加载

本章介绍 本章主要介绍 ArkUI 开发中最常用的场景下拉刷新, 上拉加载&#xff0c;在本章中介绍的内容在实际开发过程当中会高频的使用,所以同学们要牢记本章的内容。下面就让我们开始今天的讲解吧&#xff01; List 组件 在 ArkUI 中List容器组件也可以实现数据滚动的效果&a…

MR30分布式 IO 模块:硅晶行业电池片导片机的智能 “心脏”

硅晶产业作为全球能源和电子领域的基石&#xff0c;其生产规模庞大且工艺复杂。从硅料的提纯、拉晶&#xff0c;到硅片的切割、电池片的制造&#xff0c;每一个环节都要求高精度与高稳定性。在电池片生产环节&#xff0c;导片机承担着硅片传输与定位的重要任务&#xff0c;其运…

MAC虚拟机上安装WDA环境

MAC虚拟机上安装WDA环境 一、MAC虚拟机切换root权限二、macOS上安装xcode若你的macOS系统可以在appstore下载安装若你安装的macOS系统版本太低&#xff0c;无法在appstore上安装xcode 三、macOS上安装WebDriverAgent四、使用xcode配置WDA安装到手机上高版本系统支持 一、MAC虚拟…

个人ffmpeg笔记(一)

环境安装 QT环境安装 运行qt…run安装 下载地址&#xff1a;https://download.qt.io/archive/qt/ 下载地址&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.10/ sudo apt install --reinstall libxcb-xinerama0 解决xcb问题 Ubuntu16.04打开Qt显示/home/user/.co…

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.传输层协议 UDP 1.1 传输层 1.2 端口号 1.3 UDP 协议 1.3.1 UDP 协议端格式 1.3.2 UDP 的特点 1.3.3 面向数据报 1…

WordPress插件 Download-block-plugin下载按钮图标美化

WordPress插件 Download-block-plugin下载按钮图标美化

分布式 漏桶算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 漏桶算法 & 总结》《分布式 & 漏桶算法 & 问题》 概述 简介 LBA Leaky Bucket Algorithm 漏桶算法是一种流行于网络通信领域的流量控制/频率限制算法。漏桶算法的核心原理是通过一个概念上的“漏桶”来…