题目需要对dp进行优化来减少不需要的空间和时间,在这里我们使用map去保存,使用滚动数组去代替每一种草药。
那么某一种草药对状态的影响就可以表示为去遍历map里面的每一个元素,拿这个元素的时间去加上这个时间,如果满足条件那么就可以去判断这将it->first+t这个时间下的最大值更新掉。
这样可以避免需要不必要的空间。
#include <bits/stdc++.h> using namespace std; #define int long long map<int, int> mp; signed main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int n, s; int t, v; cin>>n>>s; mp[0] = 0; map<int, int>::reverse_iterator it; while (n--) { cin>>t>>v; for (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); } } } int ans = 0; map<int, int>::iterator itt = mp.begin(); for (itt;itt!=mp.end();itt++) { ans = max(ans, itt->second); } cout<<ans; return 0; }