3.8 动态规划 背包问题

一.01背包

46. 携带研究材料(第六期模拟笔试) (kamacoder.com)

代码随想录 (programmercarl.com)

携带研究材料:

时间限制:5.000S  空间限制:128MB

题目描述:

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。 

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

输入描述:

第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。

第二行包含 M 个正整数,代表每种研究材料的所占空间。 

第三行包含 M 个正整数,代表每种研究材料的价值。

输出描述:

输出一个整数,代表小明能够携带的研究材料的最大价值。

输入示例:

6 1
2 2 3 1 5 2
2 3 1 5 4 3

 1.dp状态描述

dp[i][j]表示前i个物品中行李空间为j时能带的最大价值   

space[i]表示i物品所需空间

value[i]表示i物品的价值

2.递推公式

先遍历物品再遍历背包空间时
新来一个物品i时面对两种情况 带或不带,带的前提是当前空间>新物品空间I
if(j>=space[i]) dp[i][j]=max(dp[i-1][j-space[i]]+value[i],dp[i-1][j]);
else dp[i][j]=dp[i-1][j]

3. 初始状态

是从一个一个物品开始遍历,初始状态有第一个物品即可(第一行)

    for(int i=0;i<=n;i++)
    {
        if(i>=space[0]) dp[0][i]=value[0];
    }

4.遍历顺序

先遍历物品或背包都可以,但遍历物品更好理解

#include <iostream>
#include <vector>
using namespace std;
int main() {int m = 0, n = 0;cin >> m >> n;vector<int> space,value;int tempM=m;while(tempM--){int tempSpace;cin>>tempSpace;space.push_back(tempSpace);}tempM=m;while(tempM--){int tempValue;cin>>tempValue;value.push_back(tempValue);}// for(auto e : space) cout<<e;// for(auto e : value) cout<<e;//每一个带可能带或不带,前面的选择会影响后面//dp[i][j]表示前i个物品中行李空间为j时能带的最大价值   //新来一个物品i时面对两种情况 带或不带//if(j>=space[i]) dp[i][j]=max(dp[i-1][j-space[i]]+value[i],dp[i-1][j]);//else dp[i][j]=dp[i-1][j]vector<vector<int>> dp(m,vector<int>(n+1,0));// //初始状态第一行即可for(int i=0;i<=n;i++){if(i>=space[0]) dp[0][i]=value[0];}for(int i=1;i<m;i++){for(int j=1;j<=n;j++){if(j>=space[i]) dp[i][j]=max(dp[i-1][j-space[i]]+value[i],dp[i-1][j]);else dp[i][j]=dp[i-1][j];}}cout<<dp[m-1][n];return 0;
}

 二.完全背包

52. 携带研究材料(第七期模拟笔试) (kamacoder.com)

代码随想录 (programmercarl.com)

52. 携带研究材料(第七期模拟笔试)

时间限制:1.000S  空间限制:128MB

题目描述:

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的重量,并且具有不同的价值。

小明的行李箱所能承担的总重量为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。

输入描述:

第一行包含两个整数,N,V,分别表示研究材料的种类和行李空间 

接下来包含 N 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值

输出描述:

输出一个整数,表示最大价值。

输入示例:

4 5
1 2
2 4
3 4
4 5

输出示例:

10

 1.dp状态描述(与01背包相同)

dp[i][j]表示前i个物品中行李空间为j时能带的最大价值   

space[i]表示i物品所需空间

value[i]表示i物品的价值

2.递推公式

先遍历物品再遍历背包空间时
新来一个物品i时面对两种情况 带或不带,带的前提是当前空间>新物品空间I,带的话可以选择带n个,则带的结果是以dp[i][j-space[i]]+value[i]表示,因为此时只需要空间变小即可,依旧可以选择到第i个物品
if(j>=space[i]) dp[i][j]=max(dp[i][j-space[i]]+value[i],dp[i-1][j]);
else dp[i][j]=dp[i-1][j]

3. 初始状态

是从一个一个物品开始遍历,初始状态有第一个物品即可(第一行),也有01背包略有不同

    for(int i=0;i<=n;i++)
    {
       if(i>=space[0]) dp[0][i]=max(dp[0][i-space[0]]+value[0],value[0]);
    }

#include <iostream>
#include <vector>
using namespace std;
int main() {int m = 0, n = 0;cin >> m >> n;vector<int> space,value;int tempM=m;while(tempM--){int tempSpace,tempValue;cin>>tempSpace>>tempValue;space.push_back(tempSpace);value.push_back(tempValue);}vector<vector<int>> dp(m,vector<int>(n+1,0));// //初始状态第一行即可for(int i=0;i<=n;i++){if(i>=space[0]) dp[0][i]=max(dp[0][i-space[0]]+value[0],value[0]);}for(int i=1;i<m;i++){for(int j=1;j<=n;j++){//与01背包唯一不同点就是选择带之后,依然可以选择继续带,则用dp[i][j-space[i]]+value[i]if(j>=space[i]) dp[i][j]=max(dp[i][j-space[i]]+value[i],dp[i-1][j]);else dp[i][j]=dp[i-1][j];}}cout<<dp[m-1][n];return 0;
}

三.一维数组解题

上述代码中都是按“一行”结束后进行下一行的值计算,且每次计算最多只间隔一行,没有出现间隔多行的情况,在计算第100行时只需要第99行,那么保存的0-98行都是浪费内存。

3.1 01背包

1.状态描述:

dp[j]表示空间为j时能装下的最大重量

2.递推公式:

if(j>=space[i]) dp[j]=max(dp[j-space[i]]+value[i],dp[j]);

3.初始状态
    for(int i=0;i<=n;i++)
    {
        if(i>=space[0]) dp[i]=value[0];
    }

4.遍历顺序

如果是正序:遍历物品i时

假设dp[j]已经装入了物品i,而后的dp[j+n]也可能装入物品i(可能dp[j-space[i]]的值已经变化了 不再是未装入物品i时的值)

举一个例子:物品0的重量weight[0] = 1,价值value[0] = 15

如果正序遍历

dp[1] = dp[1 - weight[0]] + value[0] = 15

dp[2] = dp[2 - weight[0]] + value[0] = 30

此时dp[2]装入了两次物品0

如果是倒序:则不会出现重复装入情况,因为dp[j-space[i]]未变化,未装入物品i

#include <iostream>
#include <vector>
using namespace std;
int main() {int m = 0, n = 0;cin >> m >> n;vector<int> space,value;int tempM=m;while(tempM--){int tempSpace;cin>>tempSpace;space.push_back(tempSpace);}tempM=m;while(tempM--){int tempValue;cin>>tempValue;value.push_back(tempValue);}vector<int> dp(n+1,0);// //初始状态第一行即可for(int i=0;i<=n;i++){if(i>=space[0]) dp[i]=value[0];}for(int i=1;i<m;i++){for(int j=n;j>=space[i];j--){dp[j]=max(dp[j-space[i]]+value[i],dp[j]);}}cout<<dp[n];return 0;
}

 3.2 完全背包

52. 携带研究材料(第七期模拟笔试) (kamacoder.com)

题目与01背包唯一不同点是,物品i可以带入多个

1.将01背包的遍历顺序改为正序

2.修改初始状态 dp[i]=max(dp[i-space[0]]+value[0],value[0]); 

#include <iostream>
#include <vector>
using namespace std;
int main() {int m = 0, n = 0;cin >> m >> n;vector<int> space,value;int tempM=m;while(tempM--){int tempSpace,tempValue;cin>>tempSpace>>tempValue;space.push_back(tempSpace);value.push_back(tempValue);}vector<int> dp(n+1,0);for(int i=space[0];i<=n;i++){dp[i]=max(dp[i-space[0]]+value[0],value[0]);}for(int i=1;i<m;i++){for(int j=space[i];j<=n;j++){dp[j]=max(dp[j-space[i]]+value[i],dp[j]);}}cout<<dp[n];return 0;
}

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

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

相关文章

2001-2022年上市公司利润表数据

2001-2022年上市公司利润表数据 1、时间&#xff1a;2001.12.31-2022.12.31 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、统计截止日期、报表类型、投资收益、其中&#xff1a;对联营企业和合营企业的投资收益、公允价值变动收益、营业利润、其他综…

探讨2024年AI辅助研发的趋势

一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今时代最具变革性的技术之一。AI的广泛应用正在重塑各行各业&#xff0c;其中&#xff0c;AI辅助研发作为科技和工业领域的一大创新热点&#xff0c;正引领着研发模式的深刻变革。从医药…

电脑小问题:Windows更新后黑屏

Windows 更新后黑屏解决方法 在 Windows 更新后&#xff0c;伴随了一个小问题&#xff0c;电脑启动后出现了桌面黑屏。原因可能是火绒把 explorer.exe 当病毒处理了。 下面讲解 Windows 更新后黑屏的解决方法&#xff0c;步骤如下&#xff1a; 1. 按 ctrl alt delete 组合键…

C语言从入门到精通 第十一章(文件操作)

写在前面&#xff1a; 本系列专栏主要介绍C语言的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C语言教材&#xff0c;笔者认为重要的部分大多都会用粗体标注&#xf…

升级Xcode 15-全程绿灯+高速公路

还没升级Xcode15的兄弟们&#xff0c;恭喜你们&#xff0c;看完这篇文章&#xff0c;让你的升级Xcode15 之路畅通无阻外加全程高速&#x1f60e;。 前提 系统要求&#xff1a;MacOS 13.5 或更高版本 系统没达到要求的兄弟&#xff0c;先下载好系统升级包&#xff0c;下载好了…

设计模式——2_4 中介者(Mediator)

我寄愁心与明月&#xff0c;随风直到夜郎西 ——李白《闻王昌龄左迁龙标遥有此寄》 文章目录 定义图纸一个例子&#xff1a;怎么调度一组地铁站台和地铁开车指挥中心 碎碎念中介者和表单平台思想但是这种平台便利性是要付出代价的变化隔离原则 姑妄言之 定义 用一个中介者对象…

抖店月销过万的爆单技巧,新手轻松月入1w+,附抖店学习资料!

我是电商珠珠 抖店开通之后&#xff0c;怎么才能快速出单是很多新手小伙伴困扰的问题。其实想要运营好抖店一点都不难&#xff0c;我做抖店也有三年多时间了&#xff0c;接下来我说的每一步&#xff0c;不管是有货源还是无货源的都适用。 1、铺货低价福利款 店铺开好之后&am…

ABAP 因去重和汇总导致金额数值错误

在去重之前&#xff0c;就有两条重复的&#xff0c;一旦进行分组汇总&#xff0c;金额就会翻倍&#xff0c;之后又进行去重&#xff0c;也是没有用的&#xff0c;错误数据是2588.6&#xff0c;是1294.3的两倍&#xff0c;现在试试先去重&#xff0c;再去计算数据 就是因为去重…

JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)

文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的…

IP定位技术在金融风控中的应用研究

随着金融科技的快速发展&#xff0c;金融行业的风险也呈现出多样化、复杂化的特点。金融风控作为保障金融安全的重要手段&#xff0c;其面临的挑战也日益加剧。在这样的背景下&#xff0c;IP定位技术作为一种先进的信息技术手段&#xff0c;正逐渐成为金融风控领域的重要工具。…

会声会影软件界面字体太小 会声会影字体放大教程

会声会影做为一款经典且流行的剪辑软件&#xff0c;凭借其较低的入门门槛&#xff0c;直观的操作和丰富的功能&#xff0c;一直以来被很多用户所喜爱&#xff0c;这其中有部分是老年用户&#xff0c;他们可能因为视力较差&#xff0c;无法看清会声会影软件界面的文字的难题。今…

Dockerfile的使用,怎样制作镜像

Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build命令参数&#xff1a; --build-arg&#xff0c;设置构建时的变量 --no-cache&#xff0c;默认false。设置该选项&#xff0c;将不使用Build …

C++指针(四)万字图文详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

本鲸:打造科技招商新引擎、实现政企资源高效对接

在当今这个快速变化的时代&#xff0c;科技创新已成为推动社会进步和经济发展的核心动力。本鲸&#xff0c;作为科技创新创业服务的平台&#xff0c;正以其独特的视角和专业服务&#xff0c;为政府和企业提供一站式科技招商解决方案&#xff0c;助力构建创新驱动的经济发展新模…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ImageAnimator)

提供帧动画组件来实现逐帧播放图片的能力&#xff0c;可以配置需要播放的图片列表&#xff0c;每张图片可以配置时长。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 ImageAni…

MySql 组合索引的使用

MySql 组合索引的使用 测试Mysql组合索引在不同的查询条件组合下的索引使用情况。当有abc 3个字的的组合索引时&#xff0c;按照MySql 的左匹配原则&#xff0c;abc&#xff0c;ab&#xff0c;a 是满足左匹配原则&#xff0c;肯定是会走索引的&#xff0c;但是其他的场景&…

ubuntu 命令行配置WiFi 密码

文章目录 一、命令行设置WiFi密码的意义二、Ubuntu的命令行设置WiFi密码步骤 一、命令行设置WiFi密码的意义 提供了一种不依赖图形界面的方式来配置WiFi连接。这对于那些没有图形界面或者需要远程配置WiFi的情况非常有用。通过命令行设置WiFi密码&#xff0c;可以方便地在终端中…

“一键批量自定义重命名:轻松驾驭文件海洋,让管理变得如此简单!“

在信息爆炸的时代&#xff0c;我们每天都会接触到大量的文件&#xff0c;从文档、图片到视频、音频等&#xff0c;各种类型、各种格式的文件充斥着我们的电脑和移动设备。如何有效地管理和组织这些文件&#xff0c;成为了我们不得不面对的问题。今天&#xff0c;我们为您带来了…

在vue2中使用tailwindcss(完整教程)

如果你看过好多教程之后&#xff0c;还是报错&#xff0c;无法使用tailwindcss&#xff0c;我希望本教程可以让你成功上岸。 环境要求 node&#xff1a;>v14.17.0 安装tailwindcss 由于最新的tailwind css使用post css 8版本&#xff0c;vue2框架暂时还不支持&#xff0…

使用docker安装运行rabbitmq---阿里云服务器

目录 0、阿里云没开端口的得要去安全组规则去添加&#xff1a; 1、下载RabbitMQ镜像&#xff1a; 2、查看镜像是否下载成功&#xff0c;得到docker镜像id&#xff1a; 3、运行RabbitMQ: 4、查看RabbbitMQ容器是否启动成功&#xff1a; 5、启动RabbitMQ中的插件管理 6、访…