快速链接

  • 原题网址
  • 题目描述
  • 格式
    • 输入格式
    • 输出格式
  • 样例
    • 输入样例
    • 输出样例
  • 提示
  • 解题思路
  • Code
    • 顺推法
    • 逆推法
    • 顺推+编号
    • 顺推+滚动

原题网址

由于某些原因,这个网址会进不去…

题目描述

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

格式

输入格式

输入的第一行有两个整数T(1≤T≤1000)T(1\le T\le1000)T(1≤T≤1000)和M(1≤M≤100)M(1\le M\le100)M(1≤M≤100),用一个空格隔开,TTT代表总共能够用来采药的时间,MMM代表山洞里的草药的数目。接下来的MMM行每行包括两个在111到100100100之间(包括111和100100100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出格式

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

样例

输入样例

70 3
71 100
69 1
1 2

输出样例

3

提示

对于30%30\%30%的数据,M≤10M\le10M≤10;
对于全部的数据,M≤100M\le100M≤100。

解题思路

这题是DPDPDP(动态规划) 背包问题的一个经典例题。而像基础的背包问题解决办法都是依照下图来的:

这个图是在输入为

10 4
5 8
3 6
4 7
2 5

的时候出现的结果。动态规划数组f[i][v]f[i][v]f[i][v]的数字表示前iii种草药在时间为vvv时可采集的最大草药数。但是上图有错,正确应如下图:

上图的红框内就是错误的地方,蓝色的“888”是正确该填的数字。废话少说,我们来讲讲这个图是怎么来的:我们举个栗子,上图的绿框内数字“777”是这么求来的:首先,考虑不选择采集当前第iii种草药(现在为333)的情况,也就是f[i−1][v]f[i-1][v]f[i−1][v];其次,考虑时间足够且选择当前第iii种草药(现在为333)的情况,也就是要把时间分成两部分,一部分是为了采摘当前种草药(现在为444)的,另一部分是为了采摘之前的最大草药数(现在为666),则为f[i−1][v−t[i]]+w[i]f[i-1][v-t[i]]+w[i]f[i−1][v−t[i]]+w[i](其中t[i]t[i]t[i]表示采摘第iii种草药所需的时间,w[i]w[i]w[i]表示第iii种草药的价值)。

Code

顺推法

#include<iostream>
#include<iomanip>
#include<istream>
#include<ostream>
#include<ios>
#include<set>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#define maxn 1000
using namespace std;
int t, m, q[maxn + 1], w[maxn + 1], s[maxn + 1][maxn + 1];void init()
{cin>>t>>m;for (int i = 1; i <= m; i ++) cin>>q[i]>>w[i];
}void comp()
{for (int i = 1; i <= m; i ++) for (int j = 1; j <= t; j ++) // DP(动态规划)循环{if (q[i] <= j) s[i][j] = max(s[i - 1][j], s[i - 1][j - q[i]] + w[i]);else s[i][j] = s[i - 1][j]; // 顺推,使用二维数组}
}void oput()
{cout<<s[m][t]; // 输出结果
}int main()
{init();comp();oput();return 0;
}

逆推法

#include<iostream>
#include<iomanip>
#include<istream>
#include<ostream>
#include<ios>
#include<set>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#define maxn 1000
using namespace std;
int t, m, q[maxn + 1], w[maxn + 1], s[maxn + 1];void init()
{cin>>t>>m;for (int i = 1; i <= m; i ++) cin>>q[i]>>w[i];
}void comp()
{for (int i = 1; i <= m; i ++) for (int j = t; j >= 1; j --) // DP(动态规划)循环{if (q[i] <= j) s[j] = max(s[j], s[j - q[i]] + w[i]); // 逆推,使用一维数组}
}void oput()
{cout<<s[t]; // 输出结果
}int main()
{init();comp();oput();return 0;
}

顺推+编号

#include<iostream>
#include<iomanip>
#include<istream>
#include<ostream>
#include<ios>
#include<set>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#define maxn 1000
using namespace std;
int t, m, q[maxn + 1], w[maxn + 1], s[maxn + 1][maxn + 1], e[maxn + 1];void init()
{cin>>t>>m;for (int i = 1; i <= m; i ++) cin>>q[i]>>w[i];
}void comp()
{for (int i = 1; i <= m; i ++) for (int j = 1; j <= t; j ++) // DP(动态规划)循环{if (q[i] <= j) s[i][j] = max(s[i - 1][j], s[i - 1][j - q[i]] + w[i]);else s[i][j] = s[i - 1][j]; // 顺推,使用二维数组}for (int i = m; i >= 1; i --){if (s[i][t]!=s[i-1][t]) // 说明当前选择了新的草药{e[i] = 1;}}
}void oput()
{cout<<s[m][t];cout<<endl;for (int i = 1; i <= m; i ++) if (e[i]) cout<<i<<" ";
}int main()
{init();comp();oput();return 0;
}

顺推+滚动

滚动数组

#include<iostream>
#include<iomanip>
#include<istream>
#include<ostream>
#include<ios>
#include<set>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<vector>
#define maxn 1000000
using namespace std;
int n, m, a[maxn + 1], b[maxn + 1], t[maxn + 1], s[maxn + 1];void init()
{cin>>n>>m;for (int i = 1; i <= m; i ++) cin>>t[i]>>s[i];
}void dp()
{for (int i = 1; i <= m; i ++) // DP(动态规划)循环{memcpy(b, a, sizeof(a)); // 滚动数组for (int j = t[i]; j <= n; j ++) a[j] = max(b[j], b[j - t[i]] + s[i]);}
}void oput()
{cout<<a[n]; // 输出结果
}int main()
{init();dp();oput();return 0;
}

大功告成∼\sim∼

【SSL】2021-08-19 1045.采药相关推荐

  1. 2021/03/09~2021/08/19 统计

    1.流程类 1.上架流程: 确定包名(有申请第三方的app_name参数需要统一).创建项目: 格式化文件路径及命名:icon.svg/png(应用图标)像素文件夹.string(应用名称/布局链接) ...

  2. OPPO|后端工程师|一面 二面| 远程牛客面试 | 凉经 (2021/08/19 | 2021/09/01)

    一面: 自我介绍 为什么不投算法相关岗位 http协议状态码 http请求网页过程 应用层协议 微服务调用用了哪些协议 nacos担任了什么角色 请求转发策略,你会怎么实现 http协议头包含的字段, ...

  3. 【Yolov5】1.认真总结6000字Yolov5保姆级教程(旧版本2021.08.03作为备份)

    旧版本2021.08.03 新版本https://blog.csdn.net/m0_53392188/article/details/119334634​​​​​​​ 以作备份 目录 一.前言 二.学 ...

  4. 职教平台粉笔科技递交港股IPO招股书:2021年1-9月营收26.3亿

    2月28日晚间消息,职业教育平台粉笔科技向香港联交所递交IPO招股书,正式启动上市计划,中金.花旗.美银证券为联席保荐人. 招股书显示,粉笔科技主营业务为成人职业教育服务,在线培训.线下培训以及教材. ...

  5. 2021.08.09【普及组】模拟赛C组比赛总结

    文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...

  6. 《安富莱嵌入式周报》第227期:2021.08.23--2021.08.29

    往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 ...

  7. 纯Go实现的Firebase的替代品 | Gopher Daily (2021.08.11) ʕ◔ϖ◔ʔ

    每日一谚:Global variables should have longer names. Go技术生态 如何才能成功将Python切换到Go - https://itnext.io/opinio ...

  8. GNSS数据下载网站整理,包括gamit、bernese更新文件地址[2021.08更新]

    本人博客园同名原创文章,展示到CSDN供大家参考,转载请声明地址:https://www.cnblogs.com/ydh2017/p/6474654.html 从事GNSS研究的小伙伴大都离不开GNS ...

  9. 2021年1-9月墨天轮最受欢迎的20篇技术文章

    自墨天轮社区成立以来,众多的的数据库相关从业者们在此相聚,大家技术专业.热爱分享.乐于交流,将自己日常的工作经验.技术雷区.学习笔记分享于此. 这些来自数据库系统架构.中间件.性能优化.交付等等不同岗 ...

  10. 一个女生物联人的自学单片机笔记2021.1.19(单片机---准备阶段)

    Hello!宝宝们,今天是2021.1.19,这里是甜小姐的后花园. 这是我的第一篇博客,以后这里就是我的秘密基地啦!我会在这里分享自己的心得和学习到的知识和体会,嘀嘀嘀,同时呢也会分享我自己的心情, ...

最新文章

  1. 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...
  2. 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
  3. LeetCode——Find the Difference
  4. 从0开始利用宝塔linux面板+WordPress一键部署搭建个人的博客介绍
  5. php 获取坐标api,怎么获取百度坐标api返回的json格式字符串或对象呢
  6. ubuntu中安装wmware-tools
  7. Revit API创建标高,单位转换
  8. 电脑w ndows无法自动修复,windows 10自动修复无法修复你的电脑
  9. RequestMapping注解的继承问题
  10. 杭电计算机组成实验2(二)超前进位加法器设计实验
  11. Linux学习总结(四)-两种模式修复系统,单用户,救援模式
  12. 由脚本创建的新元素事件不触发和用的easyUI插件中的多选框不起作用的解决方法...
  13. Oracle数据库运维方案及优化
  14. matlab中的imnoise信噪比,matlab语法fn=imnoise(f,'gaussian',0,0.02)是给f添加高斯噪声,其中数值0和0.02分别表示___和___?...
  15. c语言转换为python语言_C语言程序转换为Python语言
  16. python 读取合并单元格_python 读取合并单元格
  17. html5测试网速插件,js 检测客户端网速
  18. 机器学习之手写数字图片数据处理及识别
  19. [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
  20. 算法偏见是什么_处理人工智能的偏见如何使算法公平公正

热门文章

  1. hadoop(hdfs)常见面试题
  2. 有哪些免费、好用的多人协同办公软件推荐?
  3. 【RocketMQ】延迟消息(延迟队列)
  4. 人才召集丨美团信息安全部 “职 ”等你来
  5. 13. Roman to Integer
  6. 美国纽约大学计算机排名,纽约大学计算机科学与信息系统世界排名2019年最新排名第20(QS世界排名)...
  7. OpenVAS Failed to find config ‘daba56c8-73ec-11df-a475-002264764cea‘
  8. 程序设计思维与实践 csp路径解析、csp炉石传说
  9. 收好了,这些max工作效率的学习资源,赶紧用起来
  10. 2013ACM/ICPC亚洲区南京站现场赛——题目重现