想知道求01背包恰好装满最大价值的最优复杂度是多少?以及如下代码是否正确,可不可优化?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
//设f[i][j]表示只考虑前i个物品, 总容量恰好为j所能得到的最大价值
//考虑当前第i个物品选或不选
//f[i][j] = max{f[i - 1][k]} (k >= 0)
//f[i][j] = max{f[i - 1][k - v[i]] + w[i]) (k >= v[i])
const ll MAXN = 110;
const ll MAXM = 1e3 + 5;
const ll INF = -1e18;
ll n, m, v[MAXN], w[MAXN], dp[MAXN][MAXM], ans = INF;
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(ll i = 1; i <= n; ++i) {
for(ll j = 1; j <= m; ++j) {
dp[i][j] = INF;
}
}
for(ll i = 1; i <= n; ++i) {
cin >> v[i] >> w[i];
}
for(ll i = 1; i <= n; ++i) {
for(ll j = 1; j <= m; ++j) {
for(ll k = 0; k <= j; ++k) {
dp[i][j] = max(dp[i][j], dp[i - 1][k]);
if(k >= v[i]) {
dp[i][j] = max(dp[i][j], dp[i - 1][k - v[i]] + w[i]);
}
}
}
}
for(ll i = 0; i <= m; ++i) {
ans = max(ans, dp[n][i]);
}
cout << ans;
return 0;
}
/*
3 70
71 100
69 1
1 2
*/