【AcWing】【Mochila Costo 2D 01】1022. Pokémon Conquer

Pokémon Conquista

Para cada elfo salvaje, Xiaozhi puede necesitar usar muchas bolas de presión para someterlo, y en el proceso de sometimiento, los elfos salvajes también causarán cierto daño a Pikachu (reduciendo así la fuerza física de Pikachu ) .

Cuando la fuerza física de Pikachu es menor o igual a 0, Xiaozhi debe terminar la caza (porque necesita curar las heridas de Pikachu), y los elfos salvajes que hacen que la fuerza física de Pikachu sea menor o igual a 0 no serán sometidos por Xiaozhi.

Cuando se acaban las Pokébolas de Ash, la caza llega a su fin.

Suponemos que Xiaozhi tiene dos opciones cuando se encuentra con un elfo salvaje: someterlo o dejarlo.

Si Xiaozhi elige someterlo, definitivamente lanzará una Poké Ball que puede someter al Pokémon, y Pikachu definitivamente recibirá el daño correspondiente; si elige dejarlo, entonces Xiaozhi no perderá la Poké Ball y Pikachu no perderá fuerza física.

Xiaozhi tiene dos objetivos: el objetivo principal es someter a tantos elfos salvajes como sea posible ; si el número de elfos que pueden ser sometidos es el mismo, Xiaozhi espera que Pikachu sufra menos daño (mayor resistencia restante), porque seguirán asumiendo riesgos.

Ahora se conoce la cantidad de Pokébolas de Ash y la fuerza física inicial de Pikachu, se conoce la cantidad de Pokébolas que cada Pokémon necesita para someter y la cantidad de daño que causará a Pikachu durante el proceso de sometimiento.

¿Puedo preguntar, cómo elige Xiaozhi a qué elfos someter para lograr su objetivo?

formato de entrada

La primera línea de los datos de entrada contiene tres números enteros: N, M y K, que representan respectivamente la cantidad de pokebolas de Ash, la fuerza física inicial de Pikachu y la cantidad de Pokémon salvajes.

En las siguientes líneas K, cada línea representa un elfo salvaje, incluidos dos números enteros: la cantidad de bolas de empuje necesarias para domesticar al elfo y el daño causado a Pikachu durante el proceso de domesticación.

formato de salida

El resultado es una línea, que contiene dos números enteros: C, R, respectivamente, lo que indica que, como máximo, los elfos C pueden ser sometidos, y la fuerza física restante de Pikachu es, como máximo, R al someter a los elfos C.

rango de datos

0 <N ≤ 1000
0 < METRO ≤ 500
0 < K ≤ 100

Muestra de entrada:

10 100 5
7 10
2 40
2 50
1 20
4 20

Salida de muestra:

3 30

Ideas para resolver problemas:

Estado significa:

花费1:精灵球数量
花费2:皮卡丘体力值
价值:小精灵数量(价值都是1)
f[i, j, k]表示所有只从前i个物品中选,且花费1不超过j,花费2不超过k的选法的最大价值

Cálculo del estado:

La ecuación de transición de estado es:

f[i, j, k] = max(f[i - 1, j, k], f[i - 1][j - v1[i], k - v2[i]] + 1)

Respuesta:

最多收服的小精灵数量:f[K][N][M - 1]
剩余体力值最多 = 总体力 - 最小耗费体力
f[k][N][m - 1] == f[K][N][M - 1]
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, M = 510;
int V1, V2, n; // 球数,体力值,精灵数
int f[N][M];

int main()
{
    
    
    cin >> V1 >> V2 >> n;
    for (int i = 0; i < n; i ++) 
    {
    
    
        int v1, v2; // 花费的精灵球数量, 造成的伤害(花费皮卡丘体力值)
        cin >> v1 >> v2;
        for (int j = V1; j >= v1; j --)
            for (int k = V2 - 1; k >= v2; k --)
                f[j][k] = max(f[j][k], f[j - v1][k - v2] + 1);
    }
    
    cout << f[V1][V2 - 1] << ' ';
    int k = V2 - 1; // k表示最小耗费的体力
    while (k > 0 && f[V1][k - 1] == f[V1][V2 - 1]) k --;
    cout << V2 - k << endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/laaa123mmm/article/details/128789419
Recomendado
Clasificación