TakeoffYoung

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题意:

  给两种宝石,体积S1,S2,价值V1,V2,背包容量n,求最大收益

解决:

  题目没有给数据范围,不过显然不能背包。

  先考虑性价,假设宝石1性价比高于宝石2,则宝石2最多不可能拿超过lcm(s1, s2) / s2个。 否则的话,这部分就可以以性价比更高的代替以换取更多的价值。

  枚举性价比较低的宝石拿多少个即可

 

 1 #include <bits/stdc++.h>
 2 
 3 long long n, s1, s2, v1, v2;
 4 
 5 long long gcd(long long a, long long b)
 6 {
 7     return b ? gcd(b, a%b) : a;
 8 }
 9 
10 int main()
11 {
12     int T_T, t_t;
13     scanf("%d", &T_T);
14     for (t_t = 1; t_t <= T_T; ++t_t) {
15         scanf("%I64d%I64d%I64d%I64d%I64d", &n, &s1, &v1, &s2, &v2);
16         if (v1*s2 < v2*s1) {
17             std::swap(v1, v2);
18             std::swap(s1, s2);
19         }
20         long long max_cnt = std::min(n/s2, s1/gcd(s1, s2));
21         long long ans = 0;
22         for (long long i = 0; i <= max_cnt; ++i)
23             ans = std::max(ans, i * v2 + (n-i*s2)/s1*v1);
24         printf("Case #%d: %I64d\n", t_t, ans);
25     }
26 }

 

posted on 2015-11-04 21:52  TakeoffYoung  阅读(292)  评论(0编辑  收藏  举报