UVa 12325 宝箱

https://vjudge.net/problem/UVA-12325

题意:有一个体积为N的箱子和两种数量无限的宝物。宝物1的体积为S1,价值为V1‘宝物2的体积为S2,价值为V2。计算出最多能装多大价值的宝物。

思路:题目很清楚就是暴力枚举,但是如果不简化枚举的话肯定是会超时的,如果N/S1比较小,那就枚举宝物1的个数,如果N/S2比较小,则枚举宝物2的个数。还有一种情况就是S1和S2都很小,S2个宝物1和S1个宝物2的体积相等,而价值分别为S2*V1和S1*V2。如果前者比较大,则宝物2最多只会拿S1-1个(否则则可以把S1个宝物2换成S2个宝物1);如果后者比较大,则宝物1最多只会拿S2-1个。

 1 #include<iostream>
 2 using namespace std;
 3
 4 long long N, S1,V1, S2,V2;
 5 long long maxn ;
 6
 7 void solve1()
 8 {
 9     for (int i = 0; i <= N / S1; i++)
10     {
11         long long number = (N - i*S1) / S2;
12         long long sum = i*V1 + number*V2;
13         if (sum > maxn)  maxn=sum;
14     }
15 }
16
17 void solve2()
18 {
19     for (int i = 0; i <= N / S2; i++)
20     {
21         long long number = (N - i*S2) / S1;
22         long long sum = i*V2 + number*V1;
23         if (sum > maxn)  maxn=sum;
24     }
25 }
26
27 void solve3()
28 {
29     if (S2*V1<S1*V2)
30     {
31         for (int i = 0; i < S2 && i<=N/S1; i++)
32         {
33             long long number = (N - i*S1) / S2;
34             long long sum = i*V1 + number*V2;
35             if (sum > maxn)  maxn = sum;
36         }
37     }
38     else
39     {
40         for (int i=0; i < S1&&i<=N/S2; i++)
41         {
42             long long number = (N - i*S2) / S1;
43             long long sum = i*V2 + number*V1;
44             if (sum > maxn)  maxn = sum;
45         }
46     }
47 }
48
49 int main()
50 {
51     int n, kase = 0;
52     cin >> n;
53     while (n--)
54     {
55         cin >> N >> S1 >> V1 >> S2 >> V2;
56         maxn = 0;
57         if (S1<100 && S2<100)
58         solve3();
59         else if (N / S1 < N / S2)  solve1();
60         else solve2();
61         cout << "Case #" << ++kase << ": " << maxn << endl;
62     }
63     return 0;
64 }
时间: 2024-11-05 19:03:58

UVa 12325 宝箱的相关文章

UVA 12325 Zombie&#39;sTreasureChest

看上去非常像背包的问题,但是体积太大了. 线性规划的知识,枚举附近点就行了,优先选性价比高的, 宝物有两种体积为S0,价值V0,体积S1,价值V1. 枚举分以下几种: 1:枚举拿宝物1的数量,然后尽量多拿宝物2:O(N/S0) 2:枚举拿宝物2的数量,同上:O(N/S1) 3.贪心,尽量选性价比高的 令gcd(S0,S1)= t,S1/t*S0 = S0/t*S1:体积相同的情况下尽量选价值高的,如果S1*V0>S0*V1大,那么枚举拿宝物2的数量,最多S0/t-1个否则一定可以换成S1/t个宝

UVa 12325 Zombie&#39;s Treasure Chest【暴力】

题意:和上次的cf的ZeptoLab的C一样,是紫书的例题7-11 不过在uva上交的时候,用%I64d交的话是wa,直接cout就好了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include&l

UVa 12325 - Zombie&#39;s Treasure Chest-[分类枚举]

12325 Zombie’s Treasure Chest Some brave warriors come to a lost village. They are very lucky and find a lot of treasures and a big treasure chest, but with angry zombies. The warriors are so brave that they decide to defeat the zombies and then brin

【例题 7-11 UVA - 12325】Zombie&#39;s Treasure Chest

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 1.N/s1 < 1e6 枚举1的个数 2.N/s2<1e6 枚举2的个数 3.s1和s2的值较小 假设买了s2个1和s1个2 那么这两种物品占的体积就一样大了. 即都为s1s2 而第一种物品价值为s2v1第二种物品价值为s1v2 那么 如果s2v1>s1v2的话. 可以想见,如果第二种物品的数量超过了s1的话,显然可以把它占的体积都用来买物品1,因为那样更优. 则我们第二种物品最多只要枚举到s1就可以了. 同理s2v1

uva 12325 枚举暴力 b

Some brave warriors come to a lost village. They are very lucky and find a lot of treasures and a big treasure chest, but with angry zombies. The warriors are so brave that they decide to defeat the zombies and then bring all the treasures back. A br

(暴力)UVA - 12325 Editing a Book

题意:有一个容量为n的背包,有两种宝物,体积分别为S1,S2:价值为V1,V2.这两种宝物有无数种,现在向背包中塞宝物,问最多能装多少价值. 分析:可以很容易想到这个代码 for (int i = 0; i <= n / max(s1,s2); i++) { tmp = i * v1; ans = max(ans, tmp + ((n - i * s1) / s2) * v2); } 但是,如果max(s1,s2)很小的话,就会瞬间爆炸. 比如n有1073741824,但是max(s1,s2)=

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f