题意 你有一个体积为N的箱子和两种数量无限的宝物 宝物1的体积为s1 价值为v1 宝物2同理
输入均为32位带符号整数
你的任务是计算最多能带走多少价值的宝物
暴力枚举:
首先明白一点 如果s1<s2 则枚举 s2 枚举量为n/s2 更小
如果s1>s2 则枚举s1 枚举量为n/s1 更小
假如 s1和s2 都很小的时候 这种枚举方式 枚举量就会很大
此时有一种枚举方式可以将枚举量减少到MAX{s1 s2}
s2个宝物1 和s1个宝物2的体积相同 假若前者的价值更高 那么宝物二的数量一定小于s1 不然的 假设大于等于s1 那么s1个宝物2可以用s2个宝物1来代换 价值肯定更高 所以枚举量为s1即可
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main() { int n,v1,s1,v2,s2; int cas; cin>>cas; for(int k=1;k<=cas;k++) { cin>>n>>s1>>v1>>s2>>v2; if(s1>s2) { swap(s1,s2); swap(v1,v2); } //使得s1<s2; LL ans=0; if(n/s2>=65536) { if( s2*v1<s1*v2 ) swap(v1,v2),swap(s1,s2); for(LL i = 0; i <= s1; i++) ans = max(ans, v2*i + (n-s2*i)/s1*v1); } else for(LL i=0;i*s2<=n;i++) ans=max( ans,i*v2+(n-i*s2)/s1*v1) ; printf("Case #%d: %lld ",k,ans); } }