【蓝桥杯】小明的背包2(DP)

一.题目描述

二.问题分析 

这是一个典型的动态规划问题。

我们使用一个二维数组来解决问题,dp[i][j]表示从第1个到第i个物品中进行选取,装入容积为j的背包中商品的总价值。

其实这里隐含了一个初始条件,即dp[i][0]=0,即背包容量为0时,无论如何选取商品,其价值总为0。

如图所示,由于商品的编号从1开始,上图中箭头所指的元素值均为0。

 

有了初始条件,就需要dp的递推公式。

我们考虑最简单的一种情况,即商品的种类为1时。dp[1][j]的值完全取决于容量为j的背包能够装入多少件该商品。

此时,我们便能够将上图中绿色箭头所指的一行填上数字。

此时,我们再考虑复杂一点的情况,商品种类变为i。

也就是说,我们需要将上图表格中第i行填入。 

此时考虑产生的最大价值,我们就需要去考虑i种商品。我们可以使用已经存在的数据,来对i种商品的最大价值进行构建。

背包的容积j从0开始依次递增到v,我们考虑dp[i][j]。

我们可以使用dp[i-1][j]的值对dp[i][j]进行初始化。注意:此时这个二维数组前i-1行的数据均填写完毕,均有初值。

dp[i][j]=dp[i-1][j],表示的含义就是不加入第i种产品,与此同时,我们还需要考虑加入第i种产品,问题来了,那需要加几个呢,所以嵌入了一个内循环,k从1开始,一直循环到背包容量所能承受的最大件数。每次都要去看,max(dp[i][j],dp[i-1][j-k*item[i].weight]+k*item[i].value),哪个值更大。注意,这里一定要用dp[i][j]。

最终,构建出了这个二维数组的所有值,dp[n][v]就是我们要的结果。

具体代码如下:

//小明的背包
#include <iostream>using namespace std;const int N=1e3+10;
int n,v;//n物品种类,v背包容积struct Item{int weight;int value;
}item[N];int dp[N][N]={0};//dp[i][j]表示从第1个到第i个物品中进行选取装入容积为j的背包中int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>v;for(int i=0;i<n;i++){cin>>item[i+1].weight>>item[i+1].value;}for(int i=1;i<=n;i++){//外层循环商品的种类for(int j=0;j<=v;j++){//内层循环背包的容积dp[i][j]=dp[i-1][j];//表示不放入第i个产品for(int k=1;k*item[i].weight<=j;k++){dp[i][j]=max(dp[i][j],dp[i-1][j-k*item[i].weight]+k*item[i].value);}}}cout<<dp[n][v]<<'\n';return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS(超文本传输安全协议)工作过程

一、简述HTTPS HTTPS超文本传输协议&#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#x…

DDR协议基础进阶(三)——(基本功能、初始化、MR寄存器)

DDR协议基础进阶&#xff08;三&#xff09;——&#xff08;基本功能、初始化、MR寄存器&#xff09; 一、DDR基本功能 DDR基本功能主要包括&#xff1a; 8-bit prefetch预取——8-bit&#xff0c;是指8位数据&#xff0c;即8倍芯片位宽的数据。由于DDR内部数据传输是32bit…

Day40:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR

目录 SpringBoot-身份鉴权-JWT技术 SpringBoot-打包部署-JAR&WAR 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方组件使用等. 框架库&#xff1a;MyBatis&…

springboot项目学习-瑞吉外卖(1)

第一天任务如下&#xff1a; 建立基本架构完成登录、退出功能 注意&#xff1a;本博客没有使用网上教程里的mybatis-plus&#xff0c;使用的是mybatis&#xff1b;数据库连接池也没有使用教程里的druid&#xff0c;使用的是spring自带的连接池 基本架构 common包&#xff1a;存…

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…

vulhub中fastjson 1.2.24 反序列化导致任意命令执行漏洞复现

fastjson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。通过查找代码中相关的方法&#xff0c;即可构造出一些恶意利用链。 环境运行后&#xff0c;访问http://your-ip:8090即可看到JSON格式的输出。 …

java-ssm-jsp基于java的信访管理系统的设计与实现

java-ssm-jsp基于java的信访管理系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全 获取源码——》公主号&#xff1a;计算机专业毕设大全

Oracle 面试题及答案整理,最新面试题

Oracle中的PL/SQL和SQL有什么区别&#xff1f; PL/SQL和SQL在Oracle中的主要区别包括&#xff1a; 1、编程能力&#xff1a; PL/SQL是一种程序化语言&#xff0c;支持变量、条件语句和循环&#xff0c;而SQL主要用于数据查询和更新。 2、执行方式&#xff1a; PL/SQL可以执行…

阿里二面:什么情况会发生Full GC?如何避免频繁Full GC?

阿里二面&#xff1a;什么情况会发生Full GC&#xff1f;如何避免频繁Full GC&#xff1f; Minor GC、Major GC 和 Full GC区别&#xff1f; Minor GC、Major GC和Full GC是垃圾回收中的三个重要概念&#xff0c;它们描述了垃圾回收的不同阶段和范围&#xff1a; Minor GC&am…

基于Springboot和Redis实现的在线选课系统

1.项目简介 1.1 介绍 毕业设计真的就是demo吗&#xff1f;作为工作前的最后一个校园项目&#xff0c;毕业设计应当尽可能的贴近企业实战&#xff0c;业务不必很复杂&#xff0c;但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统&#xff0c;需求也…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:SideBarContainer)

提供侧边栏可以显示和隐藏的侧边栏容器&#xff0c;通过子组件定义侧边栏和内容区&#xff0c;第一个子组件表示侧边栏&#xff0c;第二个子组件表示内容区。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…