题目大意:
你有一个体积为N的箱子和两种数量无限的宝物。宝物1的体积为S1,价值为V1;宝物2的体积为S2,价值为V2。输入均为32位带符号的整数。你的任务是最多能装多少价值的宝物?
 
方法:其实也没那么不好想,关键是要冷静下来一步步分析,如何降低枚举的数量。首先立马想到的肯定是性价比高的先装,但问题是会有剩余空间,使得这样的贪心策略并不是最优的。假设我们现在已经满足s1*v2<=s2*v1,也就是说物品1性价比不会比物品2的小。那么设最终物品1选n1件,物品2选n2件我们得到的等式就是ans=n1*v1+n2*v2。此时显然有物品2的数量不会超过s1,(否则这s1个物品2的空间放物品1的价值为s2*v1更优),同时n2自身不会超过n/s2,对于s1<=s2的情况下显然复杂度在sqrt(n)之下;对于s1>s2时显然只能枚举物品1的数量了,首先由于物品1性价比高,所以我们不妨先全选了,然后再枚举要拿出多少物品1放物品2可取到最优解,那么显然同样我们能拿出的物品数不会超过s2,同时总的拿出的物品数不会大于n/s1,故复杂度仍然在sqrt(n)之下。这样问题就解决了。
 
本题有个有个降低枚举量的方法,即判断S1,S2的大小关系后再进行枚举但当S1,S2都很小的则用到下面一种枚举方法:
对于宝物1和2,当所占体积为S1*S2时,分别能够提供的价值为S2*V1和S1*V2,我们便可以根据两者的大小关系判断选哪一种物品,如果S2*V1>=S1*V2,则我们可以得出宝物的数量最多为S1-1,因为如果我们选了S1件宝物2,则我们完全可以用S2件宝物1去代替,而且我们获得价值会更大。因此每次可以枚举min(S1-1,cnt2)或者min(S2-1,cnt1)便可以得出答案。
另外书上提出了分类枚举的方法,我们可以根据S1和S2的范围大小而采取不同的枚举方法。
————————————————
 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("ans.txt","w",stdout);
int t,n,s1,v1,s2,v2;
scanf("%d",&t);
for(int tt=; tt<=t; tt++)
{
scanf("%d%d%d%d%d",&n,&s1,&v1,&s2,&v2);
if(s1>s2)
{
swap(s1,s2);
swap(v1,v2);
}//s1 must bigger than s2
printf("Case #%d: ",tt);
long long value=;
if(n/s2>=)
{
for(long long i=; i<=s1; i++)//2
value=max(value,v2*i+(n-i*s2)/s1*v1);
for(long long i=; i<=s2; i++)//1
value=max(value,v1*i+(n-i*s1)/s2*v2);
}
else
{
for(long long i=; s2*i<=n; i++)
value=max(value,v2*i+(n-s2*i)/s1*v1);
}
printf("%lld\n",value);
}
return ;
}

其实,当一个一个枚举的时候,可以这样想,当我的某一种比较小的时候就可以枚举他。

但是要是s1,s2都很小的时候,枚举哪个都是超时的。

这个时候,可以这样考虑,假设两中体积相等(1宝贝s2个,2宝贝s1个),但是他有一个性价比,价值分别是s2*v1 和 s1*v2;

那么如果1宝贝价值大一点,那么2宝贝肯定个数小于s1个,枚举这s1个就OK了

------------------------------------------------------------------

空间相同,想要装入更多的价值宝贝,必须尽量装入性价比高的宝贝

UVA12325-注意提高效率的思路的更多相关文章

  1. 批处理文件 .bat 并行Arcpy脚本提高效率的思路-提升版

    目录 前言 Arcpy脚本 导入库 函数定义 循环实现 批处理(.bat)脚本 前言 我在之前的博客园博客里,阐述了如何编写Arcpy脚本,如何利用Windows bat批处理脚本同时打开多个cmd窗 ...

  2. 批处理文件(.bat)并行Arcpy脚本提高效率的思路

    Arcpy提供数据处理的方便接口,但一个Arcpy脚本通常只运行于一个核上.现在电脑通常是多核乃至多处理器,如果能将任务分解为可同时进行的若干任务,便可通过并行充分利用电脑性能. 折腾了python并 ...

  3. Java之利用Freemarker模板引擎实现代码生成器,提高效率

    https://blog.csdn.net/huangwenyi1010/article/details/71249258  java模板引擎freemarker代码生成器 更多 个人分类: 一步一步 ...

  4. Js对于数组去重提高效率一些心得

    最近在找工作,好几次面试都问过数组去重的问题.虽然问的都不一样,但是核心思想是没有变的. 第一种是比较常规的方法 思路: 构建一个新的数组存放结果 for循环中每次从原数组中取出一个元素,用这个元素循 ...

  5. Oracle多表连接,提高效率,性能优化 (转)

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. ...

  6. 提高效率的Matlab使用方式

    1.花一点时间学习一些提高效率的技巧永远是值得的: 2.总结和记录永远是必要的. Command窗口: Editor窗口: 1.Tab自动补全

  7. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  8. paip.提高效率---微信 手机app快速开发平台—微网络撬动大市场

    paip.提高效率---微信 手机app快速开发平台-微网络撬动大市场   手机app快速开发平台 尤其适合crm系统,呼叫中心等业务功能...    作者Attilax  艾龙,  EMAIL:14 ...

  9. oracle里要查看一条sql的执行情况,有没有走到索引,怎么看?索引不能提高效率?

    index scan 索引扫描 full table scan是全表扫描 直接explain plan for 还有个set autotrace什么 索引一定能提高执行效率吗? 索引不能提高效率的情况 ...

随机推荐

  1. Go语言实现:【剑指offer】和为S的两个数字

    该题目来源于牛客网<剑指offer>专题. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案 ...

  2. 【Bullet引擎】刚体类 —— btRigidBody

    btRigidBody类主要用于刚体数据的计算. 在模拟刚体动画过程中,可以使用btRigidBody类获取所保存的刚体对象,进而控制刚体对象的旋转和位移.进行刚体模拟计算需要经常用到此类. API: ...

  3. Keepalived 介绍 原理

    keepalived是什么: 这里先和前面的LVS 联系一下,我们平时使用一台机器运行 LVS 进行数据的转发,这里会有两个问题1.如果这台LVS 故障了怎么办?整个集群系统都会停止工作2.LVS后端 ...

  4. 无线网络WPA加密算法基础

    2013-11-13 23:08 (分类:网络安全) 对无线没什么认识,总听说有人蹭网,还有卖蹭网器的,于是补充一下知识. 无线加密有两类:WEP WAP,目前采用WEP加密的非常少了,WEP应该只是 ...

  5. Go语言基础之结构体(面向对象编程上)

    1 自定义类型和类型别名 1.1 自定义类型 Go语言中可以基于一些基本的数据类型,使用type关键字定义自定义类型的数据 . 自定义类型定义了一个全新的类型,该新类型具有基本数据类型的特性.自定义类 ...

  6. python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)

    # python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件) import tkinter as tk from tkinter import filedial ...

  7. 二进制编译安装nginx并加入systemctl管理服务

    一.安装nginx所需环境 # yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y 二.安装ngi ...

  8. Python requests 调Jenkins登录后的接口,返回403Fobidden的原因及解决方法。

    因Jenkins启用“防止跨站点请求伪造" 解决方法: 在Manage Jenkins->Configure Global Security 设置中将“防止跨站点请求伪造”取消勾选

  9. 二次开发的Selenium Demo版本

    文件名你们自己命名就好,至于为什么要重写强制位移的函数呢,是因为Mac上Selenium不支持拖拽,只能这样做了,4个文件--------------------------------------- ...

  10. 邓士鹏【MySql大全】

    禁止使用系统关键字: typename 1.计算两个日期的时间差函数 SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01'); interval可是 ...