题目大意:
你有一个体积为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. vuejs之vue和springboot后端进行通信

    一.新建一个vue项目,建立好后的相关文件 查看一下新建好的vue项目的结构: 当前各个文件中的内容: App.vue:主入口 <template> <div id="ap ...

  2. rc.local 启动内容不生效

    系统版本  CentOS Linux release 7.2.1511 问题 :/etc/rc.local  中的内容 启动机器后不生效 经过检查 /etc/rc.local 是 /etc/rc.d/ ...

  3. 【算法总结】图论/dp-动态规划 大总结

    写于一只蹲在角落的蒟蒻-Z__X... 2020.2.7,图论和 \(dp\) 终于告一段落.蓦然回首,好似已走过许多...不曾细细品味,太多太多又绵延不断地向我涌来... 谨以此纪念 逝去 的图论和 ...

  4. emmet笔记

    1.div.div${div$}*6 生成 <div class="div1">div1</div> <div class="div2&qu ...

  5. js文本复制插件&vue

    /* HTML: * <a href="javascript:;" class="copy" data-clipboard-text="copy ...

  6. iptables详解(8)iptables自定义链

    自定义链存在的意义:对链进行分类 target可能是一个“动作“也可能是一个”自定义链” 1.新增自定义链. root@ubuntu:~# iptables -t filter -N IN_WEB#结 ...

  7. 1.3.5 详解项目中的资源——Android第一行代码(第二版)笔记

    所有以drawable开头的文件夹都是用来存放图片的. 所有以mipmap开头的文件夹都是用来存放应用图标的 所有以values开头的文件夹都是用来存放字符串.样式.颜色等配置的, layout文件夹 ...

  8. 在非NDK编译条件下使用Android Log函数

    解决的需求 有些时候不能在NDK环境编译,或者使用NDK编译会颇费周折,然后又想使用Android系统自带的Log类方法,那么我们就可以使用dlopen来实现我们的目的.比如在OpenCV中添加And ...

  9. MFC/QT 学习笔记(一)——认识windows基础库

    MFC (微软基础类库),Windows系统平台做GUI尚且OK,但不支持跨平台. //Windows消息机制: //1.SDK与API Software Development Kit,为特定软件框 ...

  10. MySQL基础(3) | 函数

    MySQL基础(3) | 函数 前言 MySQL只有标量值函数的概念,没有SqlServer那种表值函数. 语法 创建 create function f_add( a int, b int ) re ...