NC235951. 草药大师
描述
有 种草药,收集第 种草药需要花费 的时间,能够带来 的价值,每种草药只能收集一次。为了成为草药大师,你需要一个人收集草药。请问在 的时间内,你最多能收集价值和多大的草药。
输入描述
第一行输入两个整数 。
接下来 行,每行两个整数 ,分别表示收集每种草药需要花费的时间和收集草药带来的价值。
输出描述
输出一行一个整数,表示在 的时间内,你最多能收集多少价值的草药。
示例1
输入:
3 70 71 100 69 1 1 2
输出:
3
C++(g++ 7.5.0) 解法, 执行用时: 521ms, 内存消耗: 51908K, 提交时间: 2023-02-14 18:11:47
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll t,v; map<ll,ll>mp; int main() { ios::sync_with_stdio(0); ll n,s; cin>>n>>s; mp[0]=0; ll ans=0; for(int i=1;i<=n;++i) { cin>>t>>v; for(auto it=mp.rbegin();it!=mp.rend();it++) { if(it->first+t<=s) mp[it->first+t]=max(mp[it->first+t],mp[it->first]+v); } } for(auto it:mp) ans=max(ans,it.second); cout<<ans; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 470ms, 内存消耗: 51824K, 提交时间: 2023-07-15 12:45:56
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,s,t,v; map<ll,ll>a; int main() { cin>>n>>s; a[0]=0; for(int i=1;i<=n;i++) { cin>>t>>v; for(auto it=a.rbegin();it!=a.rend();it++) if(it->first+t<=s) a[it->first+t]=max(a[it->first+t],a[it->first]+v); } for(auto it:a) n=max(n,it.second); cout<<n<<endl; }
Python3 解法, 执行用时: 1603ms, 内存消耗: 99012K, 提交时间: 2023-05-26 16:59:54
import collections n, s = map(int, input().split()) d = collections.defaultdict(int) d[0] = 0 res = 0 for _ in range(n): t, v = map(int, input().split()) dt = d.copy() for cost, val in dt.items(): if cost+t<=s: d[cost+t] = max(d[cost+t], d[cost]+v) res = max(res, d[cost+t]) print(res)