题目 | Nazrin the Greeeeeedy Mouse
2023牛客暑期多校训练营5
H - Nazrin the Greeeeeedy Mouse
https://ac.nowcoder.com/acm/contest/57359/H
题意
有
物品需要从
背包需要从
题解
当 时,只考虑最大的 个背包即可。
因为对于
预处理每个区间的 0/1 背包问题
对于每个区间
预处理的时间复杂度为:
计算最终结果
转移方式为:
计算结果的时间复杂度为:
如果没有发现可只考虑个最大的背包,时间复杂度是 ,肯定是过不去的。
代码
#include <bits/stdc++.h>
#define endl '\n'
// #define int long long
using namespace std;
constexpr int MAXN = 210;
int f[MAXN][MAXN][MAXN];
int a[MAXN], b[MAXN], s[MAXN];
int dp[MAXN][2];
void solve()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i] >> b[i];
for (int i = 1; i <= m; i++)
cin >> s[max(1, min(0, n - m) + i)];
m = min(m, n);
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
for (int k = 0; k <= 200; k++)
{
f[i][j][k] = f[i][j - 1][k];
if (k - a[j] >= 0)
f[i][j][k] = max(f[i][j][k], f[i][j - 1][k - a[j]] + b[j]);
}
}
}
int p = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 0; j <= 200; j++)
dp[j][p] = 0;
for (int j = 0; j <= n; j++)
for (int k = j + 1; k <= n; k++)
dp[k][p] = max(dp[k][p], dp[j][p ^ 1] + f[j + 1][k][s[i]]);
p ^= 1;
}
cout << dp[n][p ^ 1] << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi