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;
}

posted @ 2025-07-09 11:16  Frodnx  阅读(5)  评论(0)    收藏  举报