zoukankan      html  css  js  c++  java
  • 九度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 }
  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5876490.html
Copyright © 2011-2022 走看看