首页 > 其他分享 >DP-背包问题-0/1背包

DP-背包问题-0/1背包

时间:2024-07-16 23:09:44浏览次数:7  
标签:状态 背包 题解 问题 leq DP 草药 dp

第一次写blog,不好见谅!


今天主要记录在学习背包时的感想以及个人理解。

0/1背包

疯狂的采药

题目背景

此题为纪念 LiYuxiang 而生。

题目描述

LiYuxiang 是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同种类的草药,采每一种都需要一些时间,每一种也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

如果你是 LiYuxiang,你能完成这个任务吗?

此题和原题的不同点:

\(1\). 每种草药可以无限制地疯狂采摘。

\(2\). 药的种类眼花缭乱,采药时间好长好长啊!师傅等得菊花都谢了!

输入格式

输入第一行有两个整数,分别代表总共能够用来采药的时间 \(t\) 和代表山洞里的草药的数目 \(m\)。

第 \(2\) 到第 \((m + 1)\) 行,每行两个整数,第 \((i + 1)\) 行的整数 \(a_i, b_i\) 分别表示采摘第 \(i\) 种草药的时间和该草药的价值。

输出格式

输出一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

样例 #1

样例输入 #1

70 3
71 100
69 1
1 2

样例输出 #1

140

提示

数据规模与约定

  • 对于 \(30\%\) 的数据,保证 \(m \le 10^3\) 。
  • 对于 \(100\%\) 的数据,保证 \(1 \leq m \le 10^4\),\(1 \leq t \leq 10^7\),且 \(1 \leq m \times t \leq 10^7\),\(1 \leq a_i, b_i \leq 10^4\)。

选自P1616 疯狂的采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


对于动态规划而言,背包问题是经典问题

某些人(包括我)刚开始看题目是很懵逼的,不知道为什么题解这么写

但是正如动态规划的状态的定义

状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点

选自:百度百科


它是不可控的,但是它可以通过推导得到。

即它可以从过去的状态推导出来。

状态的这个性质意味着过程的历史只能通过当前的状态去影响它的未来的发展,这个性质称为无后效性。

用人话讲我们不关心某个状态之前是怎样得到的,比方斐波那契数列。

我们并不想知道fib(n-1)和fib(n-2)的推导过程。我们只关心如何通过它们推导出当前状态,

即fib(n)是多少。这个答案是明显的。


接下来我们来思考0/1背包的状态是什么,作为板子题,我们直说:

状态就是选不选这件物品。

既然这样,正常人可能会给出这样的定义dp[i]

其中dp[i]表示前i件物品能够取到的最大价值

对dp[i]的分类讨论即选与不选。

但经过本蒟蒻的思考发现,根本没用。

因为你无法得知 如果选择这个物品 之前的状态是什么,换句话说一维开少了

不足以概括所有状态

于是就有了正解:

我们令dp[i][j]表示前i件物品背包容量为j时的最大价值。

现在就可以对它进行分类讨论了。

1、取这个物品:

明显的,它的上一个状态一定是dp[i-1]

现在考虑j

我们知道此时背包容量为j且能够装下一个体积为v[i]的物品,容易得到,最优时的j为

[j-v[i]]

于是此时dp[i][j]=dp[i-1][j-v[i]]+w[i]

2、装不下这个物品:

易得最优情况dp[i][j]=dp[i-1][j]。

3、不拿这个物品 同二

于是我们所谓的状态转移方程就出来了:

能装下(包含不取的情况):dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[j])

不能装下:dp[i][j] = dp[i - 1][j]

这个方程实际上就是上面说的“我们只关心如何通过它们推导出当前状态”的方法


代码不贴了

标签:状态,背包,题解,问题,leq,DP,草药,dp
From: https://www.cnblogs.com/PanGZ-cabin/p/18306301

相关文章

  • 【智能算法应用】人工兔优化算法求解二维栅格路径规划问题
    目录1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】人工兔优化算法(ARO)原理及实现2.二维路径规划数学模型栅格法模型最早由W.E.Howden于1968年提出,障碍物的栅格用黑色表示,可通过的自由栅格用白色表示。求解二维路......
  • 【智能算法改进】改进的麻雀搜索算法及其求解旅行商问题
    目录1.算法原理2.改进点3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】麻雀搜索算法(SSA)原理及实现2.改进点改进发现者更新位置为了使SSA算法能够避开向原点收敛的弊端,将算法向最优位置跳跃的操作转换为向最优位置的移动:......
  • 【嵌入式】面试笔试问题整理 (持续更新)
    题目答案分离,方便自查自测快速跳转:面试笔试问题==1.关键字static有什么用途?(请至少说明两种)====2.嵌入式系统中经常要用到无限循环,如何用C编写死循环?====3.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里?====4.什么是平衡二叉树?====5.解释一下......
  • 动态规划+0-1背包问题
    一、问题描述小明周末要参加学校组织的跳蚤市场活动,他准备了足球、旱冰鞋、随身听和单词书四件物品进行交易,要用他的书包把这些物品带到学校。各物品的重量w和价值v如下图所示,小明书包的最大承重量为9(忽略单位),请你帮助他找到最合理的搭配方案,使他能用书包带到学校的物品价值最......
  • jenkins+allure常见问题汇总
    1.生成allure报告时,报Cannotfindanyallurecommandlineinstallation. 原因:jenkins下载安装allure插件后,没有配置allure路径解决办法:ManageJenkins>Tools>AllureCommandine安装2.执行pytest--alluredir=./allure-result--clean-alluredir时,报error:unrecognizeda......
  • 详解Spring循环依赖,以及spring如何通过三级缓存解决循环依赖问题
     首先为了方便理解后面的图解,首先要了解spring的bean的生命周期,下图是sping的bean的生命周期流程图。图解:就是在初始化实例化A时,发现A里面依赖了B,所有看B是否在容器中存在,结果B不存在又去实例化B,B中又依赖与A,但是也不存在,就这样陷入一个死循环就是循环依赖。图解:实......
  • 来培训遇到的问题,vscode 解答汇总
    QuestionSignleton&s1=Signleton::getInstance();AnswerQuestionSignleton&s1=Signleton::getInstance();Answer看起来你想要创建一个单例模式的实例。在这里,"Singleton"看起来是一个单例模式的类,而"getInstance()"是获取该类实例的方法。通常情况下,单例模式通过私......
  • P10378 [GESP202403 七级] 交流问题题解
    思路我们把关系想成一张图,每次输入就给两个人连一条边。因为一个人只有两种选择,所以我们在一个联通块内随便找一个点,跑一遍搜索,找出这个联通块内的答案。代码如下。voiddfs(intu,intcolor){cnt2++;//cnt2是这个连通块内的总点数cnt1+=color;//这个是一所学校内......
  • 中国停车场建设市场蓬勃兴起,助力城市停车难问题迎刃而解
    一、行业简述停车场建设行业,作为城市基础设施的重要组成部分,其概念涵盖了从规划、设计到施工、运营等一系列环节,旨在为各类交通工具提供安全、便捷的停放空间。随着城市化进程的加速和汽车保有量的不断增加,停车场建设行业逐渐显露出其重要性。该行业的特点主要体现在以下几......
  • 【已解决】完美解决Python2操作中 文名文件乱码 问题:深入解析与策略
    【已解决】完美解决Python2操作中文名文件乱码问题:深入解析与策略亲测有效一、乱码问题的根源剖析二、优雅处理乱码问题的策略1.统一编码:2.正确处理文件路径:3.异常处理:4.环境适配:三、示例代码与最佳实践四、扩展应用与高级技巧五、总结与展望一、......