• 九度oj 题目1494:Dota


    题目描述:

    大家都知道在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 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <map>
     5 #include <iostream>
     6 using namespace std;
     7 
     8 int c[302];
     9 int v[302];
    10 int dp[1002];
    11 
    12 int main() {
    13     //freopen("input.txt", "r", stdin);
    14     //freopen("output.txt", "w", stdout);
    15     int n, m ,g;
    16     while(scanf("%d %d %d",&n,&m,&g) != EOF) {
    17         memset(c, 0, sizeof(c));
    18         memset(v, 0, sizeof(v));
    19         for(int i = 1; i <= n; i++) {
    20             scanf("%d %d",&c[i],&v[i]);
    21         }
    22         for(int j = 1; j <= m; j++) {
    23             int t;
    24             scanf("%d",&t);
    25             while(t--) {
    26                 int tmp;
    27                 scanf("%d",&tmp);
    28                 c[n+j] = c[n+j] + c[tmp];
    29                 v[n+j] = v[n+j] + v[tmp];
    30             }
    31             int st;
    32             scanf("%d",&st);
    33             v[n+j] = v[n+j] + st;
    34         }
    35         memset(dp, 0, sizeof(dp));
    36         for(int i = 1; i <= n+m; i++) {
    37             for(int j = c[i]; j <= g; j++) {
    38                 dp[j] = max(dp[j], dp[j - c[i]] + v[i]);
    39             }
    40         }
    41         printf("%d
    ",dp[g]);
    42     }
    43     
    44     return 0;
    45 }
  • 相关阅读:
    HDFS架构原理
    Hadoop集群搭建
    解决8080端口号占用问题
    基于SSM的Maven项目(Redis和Mysql)配置文件整合
    maven 集成SSM项目配置文件模版
    初识Spring笔记
    初识Mybatis一些总结
    将对数据库的增删改查封装为方法
    10分钟安装Elasticsearch
    ThreadLocal详解
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5876490.html
Copyright © 2020-2023  润新知