【纪中模拟2019.08.18】【JZOJ6309】完全背包
时间:2019-08-18
本文章向大家介绍【纪中模拟2019.08.18】【JZOJ6309】完全背包,主要包括【纪中模拟2019.08.18】【JZOJ6309】完全背包使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:
有$n$种物品各有无限个,背包空间为$m$,第$i$种物品的体积为$a_i$,价值为$b_i$。求在不超过背包容量的前提下,取得的最大价值。
$n\le 10^6,\quad m\le 10^{16},\quad a_i,b_i\le 100$且均为正整数。
分析:
贪心一:实际上最多有$100\times 100=10^4$种物品,可以考虑去重,这样$n$的规模下降至$10^4$。
贪心二:如果两种物品的体积相同,我们肯定不会装价值更低的那种物品,这样$n$的规模下降至$100$。
转化法:由于$m$过于巨大,然而$a_i$相比较小,我们可以想到,性价比最优的物品一定会出现极多次,这样最终方案肯定可以分割成很多完全相同的小方案(全部装同一种物品),再在剩下的容量里精打细算。因此我们先做小容量(最大可支持的范围)的背包,再来组成最终方案。
综上,我们先做$n\le 100$,$m\le 2\times 10^5$的完全背包,设$f_i$表示背包容量为$i(1\le i \le 2\times 10^5)$时能取得的最大价值,则有$$f_m=\mathop{max}\limits_{i=1}^{2\times 10^5}\{\lfloor m/i \rfloor \times f_i + f_{m\%i}\}$$
实现(100分):
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define IL inline using namespace std; typedef long long LL; const int N=100; const int M=2e4; int n; LL m,w[103]; LL f[M+3]; int main(){ freopen("backpack.in","r",stdin); freopen("backpack.out","w",stdout); scanf("%d%lld",&n,&m); memset(w,0,sizeof w); for(int i=1;i<=n;i++){ LL x,y; scanf("%lld%lld",&x,&y); w[x]=max(w[x],y); } memset(f,0,sizeof f); for(int i=1;i<=N;i++) for(int j=i;j<=M;j++) f[j]=max(f[j],f[j-i]+w[i]); LL ans=0; for(int i=1;i<=M;i++) ans=max(ans,m/i*f[i]+f[m%i]); printf("%lld",ans); return 0; }
小结:
数据规模不同,造就不同题目。应学会灵活处理。
原文地址:https://www.cnblogs.com/Hansue/p/11374000.html
- 一个 android 的框架
- Spring Cloud实战小贴士:Ribbon的饥饿加载(eager-load)模式
- android常用接口(二)
- Spring Cloud实战小贴士:Zuul的饥饿加载(eager-load)使用
- RxAndroid完全教程
- 全能型反汇编引擎 – Capstone-Engine
- Hijack攻击揭秘
- 都在说微服务,那么微服务的反模式和陷阱是什么(二)
- Spring Boot 2.0 - WebFlux framework
- Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
- SpringCloud实战小贴士:Zuul的路径匹配
- 程序员你为什么这么累【续】:编码习惯之参数校验和国际化规范
- 程序员你为什么这么累【续】:编码习惯-函数编写建议
- 那些年,我们一起碰到过的骗局
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现通过二维数组键值获取一维键名操作示例
- laravel 判断查询数据库返回值的例子
- laravel框架数据库配置及操作数据库示例
- laravel 输出最后执行sql 附:whereIn的使用方法
- laravel框架模型、视图与控制器简单操作示例
- Laravel关系模型指定条件查询方法
- 在laravel中使用with实现动态添加where条件
- laravel Model 执行事务的实现
- 在laravel中实现事务回滚的方法
- thinkphp5框架实现数据库读取的数据转换成json格式示例
- phpfpm的作用和用法
- 浅谈PHP5.6 与 PHP7.0 区别
- laravel执行php artisan migrate报错的解决方法
- Laravel统计一段时间间隔的数据方法
- laravel withCount 统计关联数量的方法