P1802 5 倍经验日
题目连接:[https://www.luogu.com.cn/problem/P1802](P1802 5 倍经验日)
注意此题会卡longlong
AC代码:
#include <bits/stdc++.h>
using namespace std;
# define int long long
bool _MUL = false;
const int N = 1e3 + 10;
int arr[N][N];
void solve()
{
int n, k;
cin >> n >> k;
vector<array<int, 3>> v(n + 1);
for(int i = 1; i <= n; ++ i)
for(int j = 0; j < 3; ++ j)
cin >> v[i][j];
for(int i = 1; i <= n; ++ i)
{
for(int j = 0; j <= k; ++ j)
{
arr[i][j] = arr[i-1][j] + v[i][0];
if(j - v[i][2] >= 0)
arr[i][j] = max(arr[i][j], arr[i-1][j-v[i][2]] + v[i][1]);
}
}
cout << arr[n][k] * 5 << endl;
}
signed main()
{
cin.tie(nullptr)->ios::sync_with_stdio(false);
int _CASE = 1;
if(_MUL) cin >> _CASE;
while(_CASE --){
solve();
}
return 0;
}
优化成一维
void solve()
{
int n, k;
cin >> n >> k;
vector<array<int, 3>> v(n + 1);
for(int i = 1; i <= n; ++ i)
for(int j = 0; j < 3; ++ j)
cin >> v[i][j];
for(int i = 1; i <= n; ++ i)
{
for(int j = k; j >= 0; -- j)
{
// 注意此处 v[i][2] 可能为 0,arr[j-v[i][2]] = arr[j]
// 此时arr[j]不能直接 += v[i][0] 更新,需要先进if判断
if(v[i][2] == 0) arr[j] += v[i][1];
else
{
arr[j] += v[i][0];
if(j - v[i][2] >= 0)
arr[j] = max(arr[j], arr[j-v[i][2]] + v[i][1]);
}
}
}
cout << arr[k] * 5 << endl;
}
浙公网安备 33010602011771号