
有n种草药,收集第i种草药需要花费t_i的时间,能够带来v_i的价值,每种草药只能收集一次。为了成为草药大师,你需要一个人收集草药。请问在S的时间内,你最多能收集价值和多大的草药。
题目
- 原题地址:草药大师
- 题目编号: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;
}