• 【牛客-14602】xinjun与阴阳师(01背包)


    xinjun与阴阳师


    题目描述

    xinjun是各类手游的狂热粉丝,因随手一氪、一氪上千而威震工大,现在他迷上了阴阳师。xinjun玩手游有一个习惯,就是经过层层计算制定出一套方案来使操作利益最大化(因此即使有扫荡券也不用,故称圣雄肝帝)。已知阴阳师有N个模式可以操作,模式i有ai种操作,但每种模式每日只能选用一种操作,可以不选。操作j能收益vj,但需要花费体力wj点。xinjun每日拥有体力M点,求他每日最多能得到多少收益。

    输入描述:

    第一行一个正整数T(T<=10),表示共有T组数据。对于每组数据,第一行两个正整数N,M(1<=N,M<=1000)。接下来N段数据,每段第一行一个正整数ai(1<=ai<=1000),第二行ai个正整数vj(1<=vj<=1000),第三行ai个正整数wj(1<=wj<=1000)。每组数据ai之和不大于104

    输出描述:

    对每组数据输出一行,即xinjun每日最多能得到多少收益。

    输入
    1
    3 10
    2
    2 3
    3 2
    2
    1 1
    3 4
    1
    5
    输出

    9

    题目链接:

    https://ac.nowcoder.com/acm/problem/14602(先注册)

    变形的01背包,只要用vector存收益vj,和花费体力wj 。

    AC代码

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <fstream>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <deque>
     7 #include <vector>
     8 #include <queue>
     9 #include <string>
    10 #include <cstring>
    11 #include <map>
    12 #include <stack>
    13 #include <set>
    14 #include <numeric>
    15 using namespace std;
    16 typedef long long ll;
    17 vector<int> v[1005],w[1005];
    18 int dp[1005];
    19 int n,m;
    20 int T;
    21 int main()
    22 {
    23     cin >> T;
    24     while(T--)
    25     {
    26         memset(dp,0,sizeof(dp));
    27         cin >> n >> m;
    28         //每次初始化vector
    29         for(int i=0; i<n; i++)
    30         {
    31             v[i].clear();
    32             w[i].clear();
    33         }
    34         for(int i=0; i<n; i++)
    35         {
    36             int a;
    37             cin>> a;
    38             for(int j=0; j<a; j++)
    39             {
    40                 int V;
    41                 cin >> V;
    42                 v[i].push_back(V);
    43             }
    44             for(int j=0; j<a; j++)
    45             {
    46                 int W;
    47                 cin >> W;
    48                 w[i].push_back(W);
    49             }
    50         }
    51         for(int i=0; i<n; i++)
    52         {
    53             for(int j=m; j>=0; j--)
    54             {
    55                 for(int k=0; k<v[i].size(); k++)
    56                 {
    57                     if(j>=w[i][k])
    58                     {
    59                         dp[j]=max(dp[j],dp[j-w[i][k]]+v[i][k]);//状态转移
    60                     }
    61                 }
    62             }
    63         }
    64         cout << dp[m] << endl;
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    架构师之路--视频业务介绍,离线服务架构和各种集群原理
    架构师之路--怎样聊技术天,限流技术和各类编程语言
    一条项目中常用的linux命令引发的经典算法题
    架构师之路--应用架构的选型和dubbo
    乐视开放平台技术架构-servlet和spring mvc篇
    架构师之路--从业务角度谈缓存的选型
    架构师之路--谈业务的合理架构
    IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
    520特篇-爱的境界
    编程十年的十种武学境界
  • 原文地址:https://www.cnblogs.com/sky-stars/p/10952171.html
Copyright © 2020-2023  润新知