• [置顶] 九度笔记之 1494:Dota


    题目1494:Dota

    1 秒

    内存限制:128 兆

    特殊判题:

    提交:559

    解决:122

    题目描述:

    大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素。
    英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备。
    为了简化问题,我们将每个装备对于英雄的功能抽象为一个整数:价值。同时,如上所说,一些特定的装备可以用来合成更强的装备,玩家会因此获得除原装备价值外额外的价值。
    给定玩家现有的金钱数,每个装备的价格和其对应的价值,以及装备合成的信息。输出,其能获得的最大价值数。
    注意:每件装备只能参与合成一件合成装备(即原装备参与合成后得到合成后的新装备,原装备消失),除非一次购买多个该种装备。

    输入:

    输入包含多组测试数据,每组测试数据第一行为三个整数n,m,g(1<=n<=100),(0<=m<=100),(1<=g<=1000)。
    分别表示存在的装备总数n,存在的装备合成关系数m,和英雄所有的金钱g。
    接下去n行,每行两个整数(p,v)(1<=p<=100,1<=v<=100)分别表示该件装备的价格p,和其自身的价值v。
    每组测试数据的最后为m行数据,每行由两部分组成。开头一个整数t(1<=t<=n),表示该组合成关系中需要t件装备,下去紧跟t件装备编号(按照装备在输入中的顺序从1到n编号),表示参与合成该装备的装备编号,最后一个数s(1<=s<=1000),代表这t件物品合成道具后获得的额外价值。

    输出:

    对于每组测试数据,输出一个整数,代表英雄可以获得的最大价值。

    样例输入:
    3 1 100
    100 20
    50 9
    50 9
    2 2 3 1
    3 1 100
    100 20
    50 9
    50 9
    2 2 3 3
    样例输出:
    20
    21

    算法分析

         这道题主要的属于背包问题,用动态规划解决,需要注意的是两点。

         1. 我们把合成的装备看作单独的一件装备,计算合成装备的价格(合成所需装备价格之和),合成装备的价值(合成所需装备价值之和 加上 额外价值)。

        for(int i = num_weapons;i<num_weapons+num_merge;i++){
            int t=0;
            std::cin>>t;
            price[i]=0;
            value[i]=0;
            for(int j = 0;j<t;j++){
                int id_weapon;
                std::cin>>id_weapon;
                price[i]+=price[id_weapon-1];
                value[i]+=value[id_weapon-1];
            }
            int s = 0;
            std::cin>>s;
            value[i]+=s;
        }

         2.这道题和其它背包问题不同的在于 装备的数量并不是固定的,玩家可以重复购买多个同一种装备,包括合成装备,只要钱够就行。所以在动态规划更新dp的时候,就是从低到高更新。

            for(int j = price[i];j<gold+1;j++){
                maxvalue[j] = std::max(maxvalue[j],maxvalue[j-price[i]]+value[i]);
            }

           参考题目1209:最小邮票数


    普通背包问题
    题目1364:v字仇杀队
    题目1462:两船载物问题
    题目1455:珍惜现在,感恩生活
    题目1209:最小邮票数
    题目1420:Jobdu MM分水果

    项目安排类题目
    题目1499:项目安排
    题目1463:招聘会
    题目1434:今年暑假不AC

    资源无限求最大值的题目
    题目1494:Dota


    源程序

    //============================================================================
    // Name        : judo1494.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    //02988825547
    #include <iostream>
    #include <cmath>
    using namespace std;
    void dota(int num_weapons,int num_merge,int gold){
        int *price = new int[num_weapons+num_merge];
        int *value = new int[num_weapons+num_merge];
        int *maxvalue = new int[gold+1];
        for(int i = 0;i<num_weapons;i++){
            std::cin>>price[i]>>value[i];
        }
        for(int i = num_weapons;i<num_weapons+num_merge;i++){
            int t=0;
            std::cin>>t;
            price[i]=0;
            value[i]=0;
            for(int j = 0;j<t;j++){
                int id_weapon;
                std::cin>>id_weapon;
                price[i]+=price[id_weapon-1];
                value[i]+=value[id_weapon-1];
            }
            int s = 0;
            std::cin>>s;
            value[i]+=s;
        }
     
        for(int i = 0;i<gold+1;i++){
            maxvalue[i]=0;
        }
        for(int i = 0;i<num_weapons+num_merge;i++){
            for(int j = price[i];j<gold+1;j++){
                maxvalue[j] = std::max(maxvalue[j],maxvalue[j-price[i]]+value[i]);
            }
        }
        std::cout<< maxvalue[gold]<<std::endl;
        delete []price;
        delete []value;
        delete []maxvalue;
     
    }
    int main() {
        //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
        int n;
        int m;
        int g;
        while(std::cin>>n>>m>>g){
            dota(n,m,g);
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1494
        User: KES
        Language: C++
        Result: Accepted
        Time:30 ms
        Memory:1520 kb
    ****************************************************************/


  • 相关阅读:
    《构建之法阅读笔记02》
    《人月神话阅读笔记01》
    第四周学习进度条
    子数组2
    敏捷开发方法综述
    子数组1
    第三周学习进度条
    四则运算3
    第二周学习进度条
    四则运算4
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3243773.html
Copyright © 2020-2023  润新知