UVA - 12325 Zombie's Treasure Chest

题目地址

给你一个体积n的箱子和两种宝物 宝物体积分别为s1 s2,价值分别为v1 v2 问怎么塞能让价值最大。

很容易想到枚举宝物1然后求宝物2,或者倒过来。但是当两个的体积都很小时枚举量就会很大。

所以分成三种情况:1、s1较大 2、s2较大 3、s1 s2都较小

1,2两种情况可以通过前行判断交换位置转换为一种情况,即直接枚举就行。

对于三,就利用贪心的思想:拿s2件1和s1件2的体积都是s1*s2 如果前面大 说明2最多只能拿s1-1个(能拿s1以上个数的话,换成1价值更高),反过来同理。利用这个就能优化。

AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
int main()
{
    int kase=0;
    int T,V,S1,V1,S2,V2;
    cin>>T;
    LL ans=0;
    while(T--)
    {
        ans=0;
        cin>>V>>S1>>V1>>S2>>V2;
        if(S1>S2)//交换位置 使S1<S2
        {
            swap(S1,S2);
            swap(V1,V2);
        }
        if(V/S2>=65532) //S2较小,则S1一定较小
        {
            for(LL i=0;i<=S2;i++)
                ans=max(ans,i*V1+(V-i*S1)/S2*V2);
            for(LL i=0;i<=S1;i++)
                ans=max(ans,i*V2+(V-i*S2)/S1*V1);
        }
        else// S2较大的情况
        {
            for(LL i=0;i*S2<=V;i++)
                ans=max(ans,V2*i+(V-S2*i)/S1*V1);
        }
         printf("Case #%d: %lld\n",++kase,ans);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值