12325 - Zombie's Treasure Chest
2015-07-19 09:28
369 查看
我有话说:开始是想写背包的,但是碍于数据范围,想到了枚举。
枚举物体1的个数,尽量装物体2,这个方法在V/S1较小是可行的。如果S1很小,那么就枚举物体2,但是当S2也很小的时候该怎么办?
注意到S2个物体1和S1个物体2所占的空间相同。但总价值有三种情况:
1.S2*V1>S1*V2;那么物体2最多只能装S1-1个。否则就可以转换成S2个物体一这是更优解。
2.S2*V1< S1*V2 类似。
3.S2*V1=S1*V2 那么默认物体2最多只能装S1-1个。
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int maxn=100000+50; typedef long long LL; int main() { int T,V,S1,V1,S2,V2; scanf("%d",&T); LL ans=0; for(int kase=1;kase<=T;kase++) { ans=0; scanf("%d%d%d%d%d",&V,&S1,&V1,&S2,&V2); if(S1>S2)//设S1<=S2 { swap(S1,S2); swap(V1,V2); } if(V/S2>=66523)//S2*S1=S1*S2 S2个物体1和S1个物体2占用空间一样 如果S2*V1>S1*V2, //物体2最多只能拿S1-1个,否则可以把S1个物体2转化成S2个物体1得到的解肯定更优 //S2*V1<=S1*V2类似 { for(LL i=0;i<=S2;i++) ans=max(ans,i*V1+(V-i*S1)/S2*V2); for(LL i=0;i<=S1;i++) ans=max(ans,V2*i+(V-S2*i)/S1*V1); }else{//S2较大 for(LL i=0;i*S2<=V;i++) ans=max(ans,V2*i+(V-S2*i)/S1*V1); } printf("Case #%d: %lld\n",kase,ans); } return 0; }
相关文章推荐
- Java+OpenOffice+SwfTools+FlexPaper仿百度文档在线阅读!
- 序列概览
- 奇数排序
- linux文件基本操作(1)
- 委派模式
- 在windows环境下,使用Eclipse和gcc-Linaro工具链,对BeagleBone进行交叉编译和远程部署
- 欢迎使用CSDN-markdown编辑器
- C# 条件与&&与条件或||的使用总结
- Tree Recovery-UVA 536
- 那些神奇的"大师"是如何炼成的(科学、迷信、心理)
- Android Fragment
- 敏捷开发之Scrum扫盲篇
- 嵌入式学习答疑
- Android之——Handler随笔
- Merge Two Sorted Lists
- poj1649 Rescue(BFS+优先队列)
- (win8系统)VMware-workstation安装教程(图文)
- java虚拟机学习笔记 一
- 《textanalytics》课程简单总结(4):课程总结
- 三次面试总结