• 9513 防空洞


    时间限制:1000MS  内存限制:65535K
    提交次数:104 通过次数:24

    题型: 编程题   语言: G++;GCC

     

    Description

        有一天,dragon123偷偷地拿锄头在学校里挖开了一个尘封已久的防空洞。
        他在这个防空洞里面找到许多贵重的东西:一些石头和一些液体。
        dragon123知道,只要他把这些石头和液体拿出去卖,那么就一定可以赚大钱。但是,他只有一个载重量为W的瓶子来装这些东西。
        防空洞里面有很多块石头,每块石头的重量为Wi,价值为Mi,但是石头不能够砸烂,否则就不值钱了。
        此外,洞里面很多种贵重的液体。对于某种液体,洞内存储了Wi重量,且这Wi重量液体的总价值为Mi。
        液体是可以部分放进瓶子里面的。也就是说,如果洞里面有Wi重量的某种液体,那么dragon123可以带走Ws(0<=Ws<=Wi)重量。
        给出洞里面石头和液体的信息,以及瓶子的载重量W,dragon123希望你帮忙计算出他能够带回东西的最大价值。
    




    输入格式

        输入文件的第一行是n与W。
        n是洞里面贵重物品的数量总和(包括石头与液体)。W是瓶子的载重量。N (1 <= N <= 100) 且 W (0 <= W <= 50000)
        接下来有n行,每行都有3个数字a,b,c。
        如果c是0,那么就意味着这一行表示的物品是石头。那么a就是这块石头的重量,b就是这块石头的价值。
        如果c是1,那么就意味着这一行表示的物品是液体。那么a就是这种液体在山洞中的总储量,b就是山洞中所有的这种液体的总价值。
    



    输出格式

        输出仅有一行,表示能够获得的最大价值。保留小数点后两位小数。



     

    输入样例

    3 150
    100 100 0
    100 100 0
    130 10 1
    



     

    输出样例

    103.85
    



     

    来源

    PKKJ 

     

    作者

    a470086609

    思路: 每个石头可以当做0-1背包物品来处理,每种液体当做多重背包物品来处理(二进制分解)

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <map>
    using namespace std;
    double dp[50005];
    int n, w;
    void onebag(int v, double u)
    {
        for(int j = w; j >= v; --j)
            dp[j] = max(dp[j], dp[j - v] + u);
    }
    void compbag(int v, double u)
    {
        for(int j = v; j <= w; ++j)
            dp[j] = max(dp[j], dp[j - v] + u);
    }
    void multibag(int v, double u)
    {
        if(u >= w) compbag(1, u * 1.0 / v);
        else {
            double t = u * 1.0 / v;
            int k = 1;
            while(k < v) {
                onebag(k, k * t);
                v -= k;
                k = k << 1;
            }
            onebag(v, v * t);
        }
    }
    int main()
    {
        int a, b, c;
        scanf("%d%d",&n, &w);
        memset(dp, 0, sizeof dp);
        for(int i = 0; i < n; ++i)
        {
            scanf("%d%d%d", &a, &b, &c);
            if(!c) onebag(a, b);
            else multibag(a, b);
        }
        printf("%.2f
    ", dp[w]);
    }
    

      

  • 相关阅读:
    Ubuntu “Failed to fetch”错误的解决方法
    #ifndef 与#pragma once
    vs TODO list使用
    window脚本编写bat程序执行
    vtk 的qt插件编译
    git bash 下载加速
    条件欧几里得聚类 pcl::ConditionalEuclideanClustering
    ANY数据类型的使用
    《C#编程风格》还记得多少
    驼峰命名法则
  • 原文地址:https://www.cnblogs.com/orchidzjl/p/4618812.html
Copyright © 2020-2023  润新知