疯狂的采药(完全背包例题详解)

2023-11-02

题目

每种草药可以无限制地采摘,每种草药对应采药时间、草药价值,求在一定的采药时间下,采出的药最大总价值是多少。

输入格式
输入第一行有两个整数,分别代表总共能够用来采药的时间 t 和代表山洞里的草药的数目 m。
第 2 到第(m+1)行,每行两个整数,第(i + 1) 行的整数 ai,bi分别表示采摘第 i 种草药的时间和该草药的价值。

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

输入输出样例
输入
70 3
71 100
69 1
1 2
输出
140
说明/提示
数据规模与约定
对于 30% 的数据,保证m≤10 3
对于 100% 的数据,保证 1≤m≤10 4,1≤t≤10 7,且 m ×t<10 7,1≤ai,bi≤104


方法一:简单完全背包思路

枚举每种背包可能取到的药草情况,维护出每个空间大小的最大价值。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

struct node{
	int time, value;
}flower[10010];

ll dp[10000010];

int main(){
	int total, sum;
	scanf("%d%d", &total, &sum);
	for(int i=0; i<sum; i++){
		scanf("%d %d", &flower[i].time, &flower[i].value);
	}
	
	for(int i=1; i<=total; i++){
		for(int j=0; j<sum; j++){
			for(int k=0; k*flower[j].time<=i; k++){
				dp[i] = max(dp[i], dp[i-k*flower[j].time]+k*flower[j].value);
			}
		}
	}
	printf("%d", dp[total]);
	
	return 0;
}

思路没错,但由于数据过大,出现超时的情况。

方法二:思路优化

方法一:枚举背包大小(时间),按药草类型再放入不同数量的药草,维护不同背包可装入的最大价值。
方法二:按药草类型放入背包,维护不同背包可装入的最大价值。
方法二较为巧妙。采第 i 个草药的时间大于或等于背包大小 j 那么可以尝试将该草药装入。这样既能就能将全部情况枚举出,又避免了判断草药放入背包的数量。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

struct node{
	int time, value;
}flower[10010];

ll dp[10000010];

int main(){
	int total, sum;
	memset(dp, 0, sizeof(dp));
	
	scanf("%d%d", &total, &sum);
	for(int i=0; i<sum; i++){
		scanf("%d %d", &flower[i].time, &flower[i].value);
	}
	
	for(int i=0; i<sum; i++){	
	//选一种草药 
		for(int j=flower[i].time; j<=total; j++){
		//尝试可放入草药的背包 
			dp[j] = max(dp[j], dp[j-flower[i].time]+flower[i].value);
		}
	}
	
	printf("%lld", dp[total]);
	
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

疯狂的采药(完全背包例题详解) 的相关文章

随机推荐

  • AsposeWord转pdf的正确姿势

    通过国内国外 官网不断查找 终于找到适合java的开发的方式 不管国内国外 全是C 和vb net的资料 为了让自己以后不会忘记 迭代更新一下Aspose的多样性操作 普通的 File file new File C Users a Dow
  • Thinkphp5之多语言

    给需要的人看 自己总结的 大神请勿喷 谢谢 目录结构 配置 控制器 view zh cn return array test gt 中文 name gt 萧风 cn us return array test gt English name
  • Java多线程:高并发下数据插入重复问题

    转自 微点阅读 https www weidianyuedu com 1 背景描述 应用框架 Spring SpringMVC Hibernate 数据库 Oracle11g 一家文学网站向我系统推多线程低并发推送数据 我这边观察日志和数据
  • Ubuntu 16.04 pycharm设置桌面快捷启动方式

    Ubuntu下所有的快捷方式都在 usr share applications 解压 这里我将pycharm下载并解压到了 home snakeson developer文件夹下 这里的pycharm sh是批处理执行文件 prcharm
  • linux设置定时任务(crontab)操作步骤

    1 登录服务器 2 输入密码 登录成功 3 查看定时器任务 crontab l 4 编辑定时器任务 crontab e 5 保存定时器任务 1 按住sec退出 2 按住shift 再按 wq 保存并退出 备注 按住shift 再按 q 强制
  • CSS flex布局最后一个元素的宽度铺满剩余的空间

    当你希望最后一个元素的宽度铺满剩余的空间是 你可以为他设计一下属性 flex grow 1 例子 div div class sma1 div div class sma2 div div big width 200px height 10
  • [1114]mysql-connector-java各种版本下载地址

    mysql connector java下载地址 http mvnrepository com artifact mysql mysql connector java 1 进去后选择自己的版本 2 然后再点击 需要下载其他的jar包 或者依
  • 彻底解决虚拟机浏览器设置、扩展等花屏空白不显示问题

    问题现象 在我们日常使用VirtualBox vmware workstation Hyper V虚拟机软件的时候 不知不觉我们有没有遇到这种情况 chrome浏览器或者win10 win11自带的Edge浏览器的设置栏 浏览器标签预览 浏
  • Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)

    575 分糖果 给定一个偶数长度的数组 其中不同的数字代表着不同种类的糖果 每一个数字代表一个糖果 你需要把这些糖果平均分给一个弟弟和一个妹妹 返回妹妹可以获得的最大糖果的种类数 示例 1 输入 candies 1 1 2 2 3 3 输出
  • Unity Navigation详解

    Unity Navigation详解 前言 从事unity相关行业以来始终看不清自己的路该怎么走 到今天才明白不需要花时间去迷茫 只管努力莫问前程 从今天开始每天写一点小东西 记录与整理自己走过的路 也一边寻找自己的路 便从unity的自动
  • BuildaFlightTrackerwithCesiumforUnreal_译

    BuildaFlightTrackerwithCesiumforUnreal 译 这个教程会使用真实世界飞机数据控制一个飞机飞过从圣弗朗西斯科到哥本哈根 你会学到怎样 1 输入真实数据到UnrealEngine 2 使用数据和USpline
  • 活动如何造势推广?会议软件帮您忙

    会议管理者辛苦策划了一场活动 如果推广宣传跟不上 那策划的心血岂不白费 如何使用有效且高效的方法为活动推广造势呢 传统推广方式耗费人力大 成本高 但通过会议软件便可以快速推广活动并有效宣传 下面为您介绍如何使用会议软件实现有效推广 01 社
  • python开发面试题

    python基础 1 Python类中的方法类型 在Python类中有四种方法类型 分别是实例方法 静态方法 类方法和普通方法 实例方法 即对象方法 需要实例化对象之后才能调用 接受的第一个参数self就是对象本身 必须使用实例化对象才可以
  • linux 图形分区工具,Linux下的图形分区工具

    在Linux下的许多情况下 分区将不足 这时 我们将需要调整分区 Windows下有很多工具 Linux下也有 您可以使用gparted进行分区 Gparted是parted的前端 图形化 linux下分区工具 通常包含在官方资源中 可以直
  • 2020年校赛网络赛

    51假期那段时间因为水了一段时间的数模校赛 加上专业课的坑越欠越多 因而已经很久很久没有补过题目了 从近到远 先把西电校赛的坑填起来 再把之前的CF牛客Atcoder补起来 qaq C 发现交换律后就显然了 D 双指针 好像第一天晚上还有个
  • 蓝桥杯2022真题:统计子矩阵、字符统计、排列字母、顺子日期、特殊时间、三角回文数、2022、星期计算

    目录 1 统计子矩阵 2 字符统计 3 排列字母 4 顺子日期 5 特殊时间 6 三角回文数 7 2022 8 星期计算 1 统计子矩阵 import os import sys 请在此输入您的代码 n m k map int input
  • chrome扩展结构

    每个打开的页面都运行在web页面环境中 一个正常的web页面环境 会先初始化css 然后建立DOM树 接着加载图片和frame等子资源 然后顺序执行所有js l chrome扩展本身运行在一个进程中 称之为background环境 back
  • 【软件测试学习笔记】白盒测试

    文章目录 一 白盒测试概述 二 分类 1 静态测试 2 动态测试 三 白盒测试原则 四 白盒测试类别 五 不同阶段不同侧重点 1 单元测试 2 集成测试 3 系统测试 4 验收测试 六 测试覆盖率 1 功能点覆盖 2 结构覆盖率 七 逻辑覆
  • LVGL在linux环境搭建篇

    LVGL环境搭建 1 环境准备 1 下载源码 https github com lvgl lvgl https github com lvgl lvgl 2 新建lvgl 文件夹 把src 和lvgl h 和lv conf template
  • 疯狂的采药(完全背包例题详解)

    题目 每种草药可以无限制地采摘 每种草药对应采药时间 草药价值 求在一定的采药时间下 采出的药最大总价值是多少 输入格式 输入第一行有两个整数 分别代表总共能够用来采药的时间 t 和代表山洞里的草药的数目 m 第 2 到第 m 1 行 每行