!hdu 4091--贪心、枚举--(思维)
来源:互联网 发布:乾坤线软件下载 编辑:程序博客网 时间:2024/05/22 15:44
题意:有一个容量为n的箱子,有两种珠宝,占的体积和价值分别是s1,v1,s2,v2,求能装下的最大的价值总量。
分析:刚开始以为是背包问题,但其实没那么简单;后来分情况讨论还是不行;后来又暴力枚举,当然是超时了。正确做法是有一部分是用背包的贪心,另一部分用枚举!现在就是看哪一部分用贪心。
看别人的题解是:L = LCM(s1,s2),可是知道大于L的部分就用价值比高的,所以n%L的部分枚举,其余部分贪心,不过这样可能得到的还不是最优解,所以n%L+L的部分枚举,这样就可以了,具体原因我还没想明白。继续思考!
注意:枚举的时候用max(s1,s2),不然会超时。
总之这道题非常好,思维很重要。
代码:
#include<iostream>#include<cmath>using namespace std;long long t,n,s1,s2,v1,v2,ans,mx,tmp,l;int gcd(long long a,long long b){if(a<b) swap(a,b);if(a%b==0) return b;return gcd(b,a%b);}int main(){cin>>t;for(int i=1;i<=t;i++){mx=-1;cin>>n>>s1>>v1>>s2>>v2;l=s1*s2/gcd(s1,s2);int p=n/l,q=n%l;if(p){p--;q+=l;}if(s1*v2<s2*v1) ans=p*l/s1*v1;else ans=p*l/s2*v2;if(s1<s2){swap(s1,s2);swap(v1,v2);}for(int j=0;j<=q/s1;j++){tmp=v1*j+v2*((q-j*s1)/s2);if(mx<tmp) mx=tmp;}ans+=mx;cout<<"Case #"<<i<<": "<<ans<<endl;}}
0 0
- !hdu 4091--贪心、枚举--(思维)
- hdu 4091 数学思维题贪心
- hdu 5802 Windows 10 (贪心 + 思维)
- FZU 2252 Yu-Gi-Oh! (思维 枚举 贪心)
- hdu 3697(贪心+部分枚举)
- hdu 4898 LCP+贪心思维
- hdu 4803 贪心/思维题
- hdu 5821 Ball 贪心+思维
- hdu 5073 Galaxy【思维+贪心】
- 枚举+贪心 hdu-4334-Trouble
- hdu 6103 暴力枚举+贪心
- HDU 6052 To my boyfriend 思维 + 枚举(计数)
- HDU 6103 Kirinriki 枚举中间点(思维)+ 尺取
- hdu 5281 Senior's Gun(贪心)(思维)
- HDU 4268 AliceBob大牌覆盖小牌-思维(贪心+multiset)
- HDU 5773 The All-purpose Zero(LIS+贪心思维)
- HDU 5744 Keep On Movin(思维+贪心)
- HDU 5500 Reorder the Books(贪心+思维)
- WEKA使用教程(经典教程转载)
- SSL双向认证以及证书的制作和使用
- List::insert remove
- opencv关于分水岭算法cvWatershed的运用
- WIN8 64位系统 APPIUM环境的安装
- !hdu 4091--贪心、枚举--(思维)
- 第三章第四十二题
- 3d数学基础-4x4齐次矩阵-用C++代码实现
- Android事件处理模型
- 使用 JMeter 完成常用的压力测试
- 随想随摘
- Evaluate Reverse Polish Notation - LeetCode 150
- 制作jpg图片中隐藏rar文件
- getchar(),gets,scanf()的区别