NC235951 草药大师

题目

  • 原题地址:草药大师
  • 题目编号:NC235951
  • 题目类型:DP、Map、map优化超大背包
  • 时间限制:C/C++ 1秒,其他语言2秒
  • 空间限制:C/C++ 262144K,其他语言524288K

1.题目大意

  • \(n\) 种草药,收集第 \(i\) 种草药需要花费 \(t_i\)​ 的时间,能够带来 \(v_i\)​ 的价值,每种草药只能收集一次。为了成为草药大师,你需要一个人收集草药。请问在 \(S\) 的时间内,你最多能收集价值和多大的草药。

2.题目分析

  • 用上map写个\(dp\)即可
  • 新知识点:反向迭代器c.rbegin();c.rend()

3.题目代码

#include <bits/stdc++.h>
#define ll long long
#define x first

using namespace std;

ll n, s, t, v;
map<ll,ll> a;
int main() {
    cin >> n >> s, a[0]=0;
    while(n--) {
        cin >> t >> v;
        for(auto b=a.rbegin();b!=a.rend();b++) if(b->x+t<=s)
            a[b->x+t] = max(a[b->x+t],a[b->x]+v);
    } for(auto b:a) n = max(n,b.second);
    cout << n << endl;
}
posted @ 2022-09-15 13:41  仪战群儒  阅读(104)  评论(0)    收藏  举报