题意:
你有一个体积为N的箱子和两种数量无限的宝物。宝物1的体积为S1,价值为V1;宝物2的体积为S2,价值为V2。输入均为32位带符号的整数。你的任务是最多能装多少价值的宝物?
分析:
分类枚举, 取两者体积的最小公倍数, 看看在同体积不同数量的两种物品哪个价值大, 价值小的一定不会拿超过这个数目。
#include<cstdio> #include<iostream> #include<vector> #include<string> #include<cstring> #include<algorithm> using namespace std; int main(){ // freopen("1.txt","r", stdin); // freopen("2.txt","w", stdout); long long t; cin >> t; long long kase = 1; while(t--){ long long n, s1, v1, s2, v2; cin >> n >> s1 >> v1 >> s2 >> v2; long long max_val = -1; if(s2 * v1 > s1 * v2){//说明物品2不会挑选超过s1个,枚举 物品2 long long k = s1; k = min(s1, n/s2); for(long long t = k; t >= 0; t--){ long long val = t * v2; long long remain_s = n - t * s2; if(remain_s >= s1) val += (remain_s/s1) * v1; max_val = max(max_val, val); } }else{//说明物品1不会挑选超过s2个,枚举 物品1 long long k = s2; k = min(s2, n/s1); for(long long t = k; t >= 0; t--){ long long val = t * v1; long long remain_s = n - t * s1; if(remain_s >= s2) val += (remain_s/s2) * v2; max_val = max(max_val, val); } } cout << "Case #" << kase++ << ": " << max_val << " "; } }