洛谷P1048 采药

【动态规划】01背包问题-练习题-采药 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰... 阅读详情

题面

总时间T,物品种数M
对每个物品有消耗时间和价值两种属性,每种物品只有一个
问最大价值
1≤T≤1000,1≤M≤100

分析

经典的01背包问题,即一个物品只能拿或不拿,并在一个限制下对另一个属性取最大值。
它由可分割的背包问题产生(贪心问题),又能拓展为完全背包(物品无限)等情况

dp中重要的问题有两个:状态与转移
dp中的状态比较有特点的地方是无后效性,就好比A→B→C的路径,A→B内发生的选择,不影响B→C内的选择
转移用转移方程来表示,从而可以递推地解决问题,与贪心不同,dp是兼顾全局的

本题的状态为选择物品和背包剩余的空间。
可以确定为二维的f[i][j]f[i][j]f[i][j],它的值表示在选择总时间为T-j,选择前i个物品时,能达到的最大价值。
假定物品有这三个:
①时间5,价值20
②时间6,价值10
③时间4,价值12

总时间容量10
可以分物品来考虑
在①物品时
f[1][10]=f[1][9]...=f[1][5]=20,f[1][4]=f[1][3]...=f[1][1]=0f[1][10]=f[1][9]...=f[1][5]=20,f[1][4]=f[1][3]...=f[1][1]=0f[1][10]=f[1][9]...=f[1][5]=20,f[1][4]=f[1][3]...=f[1][1]=0

单独选②物品时
f[1][10]=f[1][9]...=f[1][6]=10,f[1][5]=f[1][3]...=f[1][1]=0f[1][10]=f[1][9]...=f[1][6]=10,f[1][5]=f[1][3]...=f[1][1]=0f[1][10]=f[1][9]...=f[1][6]=10,f[1][5]=f[1][3]...=f[1][1]=0

在①基础上选②物品时(选了①物品之后,不能选上②物品),所以
f[2][10]=f[2][9]...=f[2][5]=20,f[2][4]=f[2][3]...=f[2][1]=0f[2][10]=f[2][9]...=f[2][5]=20,f[2][4]=f[2][3]...=f[2][1]=0f[2][10]=f[2][9]...=f[2][5]=20,f[2][4]=f[2][3]...=f[2][1]=0
其中如f[2][6]=maxf[1][6],f[1][6−w[2]]+val[2]f[2][6]=max{f[1] [6], f[1] [6-w[2]] +val[2] }f[2][6]=maxf[1][6],f[1][6−w[2]]+val[2](当后者存在时,这里不存在,所以直接f[1][6])

在①②基础上选③物品时
f[3][10]=32f[3][10]=32f[3][10]=32,可以同时选中①③,或者说maxf[2][10],f[2][10−w[3]]+val[3]=f[2][6]+val[3]=20+12=32max{f[2] [10], f[2] [10-w[3]] + val[3]}=f[2][6]+ val[3]=20+12=32maxf[2][10],f[2][10−w[3]]+val[3]=f[2][6]+val[3]=20+12=32

f[3][9]=32f[3][9]=32f[3][9]=32,可以同时选中①③

f[3][8]=f[3][7]=f[3][6]=f[3][5]=20f[3][8]=f[3][7]=f[3][6]=f[3][5]=20f[3][8]=f[3][7]=f[3][6]=f[3][5]=20,只能选中①

f[3][4]=12f[3][4]=12f[3][4]=12,选中③

f[3][3]=f[3][2]=f[3][1]=0f[3][3]=f[3][2]=f[3][1]=0f[3][3]=f[3][2]=f[3][1]=0

此时f[3][10]的值就是最大值

代码

二维数组
注意第二层循环倒着推,防止进入完全背包的圈套(导致同一个物品放入多次)

#include "cstdlib"
#include "cstdio"
#include "iostream"
#include "cstring"
#include<algorithm>
using namespace std;
int main()
{
    int T,M,w[1001],val[1001],f[1001][1001];//T为时间,M为数量,为重量,val为价值
    cin>>T>>M;
    for(int i=1;i<=M;i++)cin>>w[i]>>val[i];
    
        for(int i=1;i<=M;i++)
            for(int v=T;v>0;v--)
            if(w[i]<=v)f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+val[i]);//标记
            else f[i][v]=f[i-1][v];
    cout<<f[M][T];
    system("pause");
    return 0;
}

在代码中发现,标记的那一行,用到的上一行的数据,都已经被更新且之后不会再用到(可以自己画一下表格验证数据),由此可以将二维化一维,这个一维数组其实就是由上一行未更新的部分和当前行已经更新的部分

#include "cstdlib"
#include "cstdio"
#include "iostream"
#include "cstring"
#include<algorithm>
using namespace std;
int T, M, w[1005], val[1005], f[1005];//T为时间,M为数量,w为重量,val为价值
int main()
{
    cin >> T >> M;
    for (int i = 1;i <= M;i++)cin >> w[i] >> val[i];


    for (int i = 1;i <= M;i++)
        for (int v = T;v > 0;v--)
            if (w[i] <= v)f[v] = max(f[v], f[v - w[i]] + val[i]);
            else f[v] = f[v];
    cout << f[T];
    return 0;
}


【题解-洛谷】P1048 [NOIP 2005 普及组] 采药 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。如果你是辰辰,你能完成这个任务吗? 阅读详情

相关推荐

OpenCompass实战:从零部署大模型评测平台,量化模型能力选型

在大模型技术选型与评估中,客观、可量化的评测体系是工程实践的关键。其核心原理在于通过标准化的数据集、统一的评测方法与自动化流程,将主观的模型体验转化为可比较的指标数据。这种评测框架的技术价值在于解决了模型能力评估的模糊性问题,为开发者提供了模型选型、效果对比与迭代优化的科学依据。典型的应用场景包括对比不同开源模型在代码生成、逻辑推理等特定任务上的性能,或是评估微调后模型在业务数据集上的提升效果。OpenCompass作为开源的大模型全能力评测平台,正是这一理念的工程化实现。它通过模块化的四层流水线架构和配置

weixin_28725037的博客 626

洛谷——P1048采药

动态规划——01背包问题

weixin_44750790的博客 855

从MCU到MPU:瑞萨RZN2L上手初体验,给Cortex-M工程师的Cortex-R52入门避坑指南

本文详细介绍了从MCU到MPU的过渡经验,特别是瑞萨RZN2L开发板的实战避坑指南。针对Cortex-M工程师转向Cortex-R52内核的挑战,文章深入解析了启动流程、内存管理、中断响应等九大本质差异,并提供了硬件设计陷阱和软件迁移的实用技巧,帮助开发者快速适应MPU开发环境。

weixin_29158413的博客 256

洛谷—题解 P1048 采药

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

qq_41616301的博客 1656

从软体机器人到鞋垫分析:Abaqus超弹性材料(Ogden模型)仿真配置全流程

本文详细介绍了Abaqus中Ogden模型在超弹性材料仿真中的应用全流程,涵盖从实验数据导入、参数拟合到模型构建与求解优化的关键步骤。特别针对鞋垫分析等生物力学场景,提供了单元选择、接触设置和并行计算等实用技巧,帮助工程师实现高精度仿真分析。

weixin_42525385的博客 399

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 温度传感器DS18B20

2.1 理论分析 2.1.1概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也就是只需占用主机一个I/O口,无需其他外围电路,直接将环境温度转换为数字信号,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。另外,以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量

不问归期的博客 8304

【洛谷】采药(01背包问题)

二维数组解以及将二维数组优化为一维数组的做法

m0_74758366的博客 1436

18、未来医疗信息学中的太赫兹天线技术

本文探讨了太赫兹天线技术在医疗信息学中的关键作用,重点分析了分裂环谐振器和纳米结构光导天线(PCA)的设计与性能提升方法,介绍了相干与非相干太赫兹检测技术,并通过等效电路模型和数值模拟深入解析PCA工作机理。文章还展示了太赫兹技术在无创血糖监测、肿瘤检测等医疗诊断中的实验应用,总结了其非侵入性、高分辨率成像和多参数分析等优势,同时指出信号检测难、成本高和技术复杂等挑战。未来趋势包括设备小型化、效率提升及与人工智能融合,拓展至药物研发、皮肤与神经疾病诊断等领域,展现出变革医疗健康的巨大潜力。

milk8的博客 146

(洛谷)题目题号P1048 [NOIP2005 普及组] 采药

这个问题是一个典型的0-1背包问题,其中每种草药可以无限制地采摘,但是每种草药的采摘时间不能超过总的可用时间。我们的目标是在不超过总时间限制的情况下,最大化采摘草药的总价值#^.^#。时间内能够获得的最大价值。然后,对于每种草药,我们考虑是否将其加入到当前的采摘方案中。在这个问题中,我们可以使用动态规划来解决。:对于每种草药,遍历动态规划数组,更新能够获得的最大价值。:对于每种草药,如果将其加入到当前的采摘方案中,更新。即为在规定的时间内,可以采到的草药的最大总价值。,所有元素初始化为0。

C++老手 426

【乐企】有关乐企能力测试接口对接-基础版(详细)

乐企能力测试接口对接详细代码以及步骤

九七的博客 7658

如何使用 ABAP 代码调度一个 ABAP 程序,让其以后台作业的方式运行

笔者之前的教程,介绍了如何使用 SM36 一系列事务码,将一个 ABAP 程序,调度成以后台作业方式运行的详细步骤。 38. 如何让 ABAP 报表在后台作业的模式下运行 大家如果照着上述文章的步骤走一遍,会发现这些手动执行的步骤还是有些繁琐的。 有没有可能让这一切都自动化起来,即通过 ABAP 代码去完成呢?当然可以。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1942

洛谷 P1048 采药 01背包模板题

洛谷 P1048 采药 01背包问题,每个物品只能拿一次,且与拿物品的顺序无关,相当于组合。 不想要第 i 棵树,和放不进去是一样的,价值和空间都没有变化,也就是前 i-1 棵树 j 时间的最大价值。 如果要第 i 棵树,前 i - 1 棵树 j - arr[i - 1][0] 时间的最大价值加上第 i 棵树的价值,因为需要给第 i 棵树留出空间,所以前面 i -1棵树就只剩下 j - arr[i -1][0]的空间了,所以这时候的价值就是 i - 1 棵树 j - arr[i - 1][0]时间加上第 i

weixin_46621409的博客 413

YOLOv8【第一章:基础入门篇·第2节】一文搞定,数据集制作与标注完全指南!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 1505

洛谷 | P1048 采药【01背包】

动态规划 专题 洛谷 P1048 采药 题目描述 输入输出格式 说明 对于 30% 的数据,M ≤ 10; 对于全部的数据,M ≤ 100。 NOIP 2005 普及组第三题 时空限制 时间:1000ms 空间:128MB 思路 最基础的 01背包 问题,可以找到做 DP 问题的信心!:) 递推关系 dp[j] = max(dp[j], dp[j-good[i].t]+good[i]...

Wonz 626

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

洛谷P1048—— [NOIP 2005 普及组] 采药

但是明显不是最优的,用脑子想了一下,发现 dp[2][j](j>6)=20,这个 20 怎么来的呢,当然是从前一个状态来的(注意这里就可以分为两种情况了):一种是选择第二个物品放入,另一种还是选择前面的物品;接着 i=2 放两个物品,求的就是 dp[2][j] 了,当 j<5 的时候,是不是同样的 dp[2][j](j<5) 等于0;到这里就可以了,依次类推,动态转移方程为:dp[i][j]=max(dp[i−1][j−w[i]])+v[i],dp[i−1][j])转化时间为背包容量和草药占的量。

yuyu130225的博客 1211

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

(01背包)洛谷P1048采药

洛谷P1048采药 思路: 01背包板子题。dp[j]=max(dp[j],dp[j-w[i]]+v[i])。 代码: #include<bits/stdc++.h> const int N=1e6+10; const int mod=1e7+9; const int maxn=0x3f3f3f3f; const int minn=0xc0c0c0c0; const int inf=9...

Z7784562的博客 235

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

洛谷 P1048采药 P1616疯狂的采药

0-1背包问题 采药采药P1048 采药解题思路代码初版代码优化版P1616 疯狂的采药解题思路代码谨记关于变量关于边界关于数组态度决定一切,细节决定成败 采药 LiYuxiang 是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子, 这个山洞里有一些不同种类的草药,采每一种都需要一些时间,每一种也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个

charron_hao的博客 604

洛谷 P1048 采药

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

weixin_30807779的博客 86

洛谷 P1048 [NOIP2005 普及组] 采药

本文介绍了如何使用动态规划解决洛谷P1048采药问题,这是一道经典的01背包问题。文章提供了C++和Python两种实现代码,通过构建动态规划表,逐步求解在限定时间内能采集草药的最大总价值。关键在于理解背包问题的状态转移方程,并根据物品体积和价值进行决策。难度适中,适合巩固动态规划基础。最后鼓励读者思考并留言交流。

jzwalliser的博客 1198

洛谷 P1048 采药 01背包

dp数组一定要先进行初始化(不然会出错),数组放在int函数外面也可以全部初始化为0 未AC的 #include&lt;stdio.h&gt; #include&lt;iostream&gt; #include&lt;string&gt; #define max(a,b) a&gt;b?a:b using namespace std; int main() { int t, m; ...

sinat_42424364的博客 223

洛谷 P1048 采药--动态规划求解采药最优策略

本文分析了背包问题在采药场景中的应用。通过0-1背包模型求解,建立动态规划算法:定义dp[i][j]表示前i种草药在时间j内的最大价值。提供二维数组实现方案,并详细说明状态转移过程。进一步提出空间优化方案,使用一维数组将复杂度降至O(T),并探讨预处理筛选和时间优化技巧。文章还验证了算法正确性,讨论完全背包、多重背包等变式问题,最后列举了在资源分配、投资优化等领域的实际应用。该解决方案兼顾理论严谨性与工程实践性。

qq_16759367的博客 1022

洛谷_P1048 [NOIP2005 普及组] 采药_dp_python写法

动态规划练习

Hooray11的博客 347

洛谷P1048 采药(DP,0-1背包)

洛谷P1048 采药(DP,0-1背包) 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该

earnMoney的专栏 459

洛谷:P1048 [NOIP 2005 普及组] 采药

【代码】洛谷:P1048 [NOIP 2005 普及组] 采药。

ra90fy的博客 185

采药 洛谷 - P1048

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

2301_80020275的博客 353
上一篇: 洛谷P1546 最短网络
下一篇: 洛谷P1616 疯狂的采药
engineoid
博客等级 码龄10年 6粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值