标签:txt mda 完全 bigger 提高 ret 相同 algo ++
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 //freopen("in.txt","r",stdin); 8 //freopen("ans.txt","w",stdout); 9 int t,n,s1,v1,s2,v2; 10 scanf("%d",&t); 11 for(int tt=1; tt<=t; tt++) 12 { 13 scanf("%d%d%d%d%d",&n,&s1,&v1,&s2,&v2); 14 if(s1>s2) 15 { 16 swap(s1,s2); 17 swap(v1,v2); 18 }//s1 must bigger than s2
19 printf("Case #%d: ",tt); 20 long long value=0; 21 if(n/s2>=65536) 22 { 23 for(long long i=0; i<=s1; i++)//2 24 value=max(value,v2*i+(n-i*s2)/s1*v1); 25 for(long long i=0; i<=s2; i++)//1 26 value=max(value,v1*i+(n-i*s1)/s2*v2); 27 } 28 else 29 { 30 for(long long i=0; s2*i<=n; i++) 31 value=max(value,v2*i+(n-s2*i)/s1*v1); 32 } 33 printf("%lld\n",value); 34 } 35 return 0; 36 }
其实,当一个一个枚举的时候,可以这样想,当我的某一种比较小的时候就可以枚举他。
但是要是s1,s2都很小的时候,枚举哪个都是超时的。
这个时候,可以这样考虑,假设两中体积相等(1宝贝s2个,2宝贝s1个),但是他有一个性价比,价值分别是s2*v1 和 s1*v2;
那么如果1宝贝价值大一点,那么2宝贝肯定个数小于s1个,枚举这s1个就OK了
------------------------------------------------------------------
空间相同,想要装入更多的价值宝贝,必须尽量装入性价比高的宝贝
标签:txt mda 完全 bigger 提高 ret 相同 algo ++
原文地址:https://www.cnblogs.com/savennist/p/12241610.html