一种不太稳定的做法

二位大佬讲述了map优化超大背包的正解,那我就来说一下我是怎么用不太正确的复杂度卡进正解的吧。

实际上就是记忆化搜索……

然后开了n个unordered_map,就这样简简单单的通过了哈哈哈哈哈……

这道题的数据有待加强,毕竟这种剪枝做法真的不好说能不能通过。

AC代码:

#include <bits/stdc++.h>
using namespace std ;
#define int long long
int t[110] , v[110] ;
unordered_map<int,int> mp[110] ;


int dfs(int i, int j) {
    if(i==0)    return 0 ;
    if(mp[i-1].find(j)!=mp[i-1].end())    return mp[i-1][j] ;
    int res = dfs(i-1,j) ;
    if(j>=t[i])    res = max(res, dfs(i-1,j-t[i])+v[i]) ;
    return mp[i][j] = res ;
}

signed main() {
    ios::sync_with_stdio(false) ;
    cin.tie(nullptr) , cout.tie(nullptr) ;
    int n , S ;    cin >> n >> S ;
    for(int i=1 ; i<=n ; i++)    cin >> t[i] >> v[i] ;
    cout << dfs(n,S) << endl ;
    return 0 ;
}