H.Adventurer's Guild

#include <iostream>

using namespace std;

const int N = 1010, M = 310;

long long f[M][M];
int v1[N], v2[N], w[N],v3[N];//怪物的生命值,蓝量,价值

int main()
{
    int n, h, s;
    cin >> n >> h >> s;
    int cnt = 0;
    for (int i = 1; i <= n; i ++ )
    {
        int a, b, c;
        cin >> a >> b >> c;
        if (a >= h || a + b >= h + s) continue;
        v1[++cnt] = a, v2[cnt] = b, w[cnt] = c, v3[cnt] = a + b;
    }

    long long res = 0;
    for (int k = 1; k <= cnt; k ++ )//怪物数量
        for (int i = h; i > v1[k]; i -- )//生命值
            for (int j = s; j >= 0; j -- )//价值                f[i][j]表示打这个怪物的最大价值
            {
                if (i > v1[k] && i + j > v1[k] + v2[k])//可以打过这个怪物
                {
                    
                    if (v2[k] > j)//蓝量不够
                    {
                        int x = v1[k] + v2[k] - j;//蓝量不够用生命值去减
                        f[i][j] = max(f[i][j], f[i - x][0] + w[k]);//在打上一个怪物的时候的总价值和打掉这个怪物之后的总价值取最大
                        res = max(res, f[i][j]);
                    }
                    else//蓝量够
                    {
                        f[i][j] = max(f[i][j], f[i - v1[k]][j - v2[k]] + w[k]);
                        res = max(f[i][j], res);
                    }
                }
            }

    //for (int i = h; i > 0; i -- )
        //for (int j = s; j >= 0; j -- )
            //for (int k = 1; k <= n; k ++ ) cout << f[i][j][k] << endl;
    cout << Max << endl;
    cout << res << endl;

    return 0;
}

/*
2 66 22
1 23 2
66 8 90

5 16 22
1 23 11
5 8 14
2 36 99
15 22 27
0 0 10000
*/

posted @ 2021-05-09 21:26  梨花满地  阅读(70)  评论(0)    收藏  举报