[Entrevista de reclutamiento en el campus de Java] Algoritmo práctico (1): resumen del problema de la mochila


Prefacio

"Algoritmos prácticos" es la tercera parte de esta columna. Esta publicación de blog es la primera publicación de blog. Principalmente recopila problemas comunes de mochilas y sus variantes. Si es necesario, puede:

  1. Haga clic aquí para volver al índice de artículos de esta columna.
  2. Haga clic aquí para ir al siguiente artículo "[Entrevista de reclutamiento en el campus de Java] Algoritmo práctico (2): 2 a la enésima potencia (trueno)"

1, 01 mochila

  1. Nota: Sólo hay uno de todo, puedes elegir instalarlo o no.

  2. oficial:

    public static int solve(int[] costs, int[] values, int budget, int n){
    
    
        int[] pkg = new int[budget + 1];
        for (int i = 0; i < n; i++){
    
    
            for (int j = budget; j >= costs[i]; j--)
                pkg[j] = Math.max(pkg[j], pkg[j - costs[i]] + values[i]);
        }
        return pkg[budget];
	}

2. Variante 01 mochila 1 - múltiples mochilas

  1. Explicación: La cantidad de cada cosa es diferente, es un número finito

  2. oficial:

    public static int solve(int[] costs, int[] values, int[] counts, int budget, int n) {
    
    
        int[] pkg = new int[budget + 1];
        for (int i = 0; i < n; i++) {
    
    
            while (counts[i]-- > 0) {
    
    
                for (int j = budget; j >= costs[i]; j--) {
    
    
                    pkg[j] = Math.max(pkg[j], pkg[j - costs[i]] + values[i]);
                }
            }
        }
        return pkg[budget];
	}

Nota: Hay un caso especial, es costdecir value(como un cierto volumen de carros de bueyes tirando pasto, cuanto mayor sea el volumen, mejor), al llamar a este solvemomento, los dos primeros parámetros se pueden pasar costo value;


3. Variante 01 Mochila 2

  1. Nota: Hay un límite de transacción más tradeFloor, es decir, budgetdebe ser mayor que 1 tradeFloor[i]antes de cost[i]poder comprar el artículo i. Para obtener más detalles, consulte Comerciantes orgullosos.

  2. oficial:

    private static class Merchandise{
    
    
        int cost;
        int tradeFloor;
        int value; 
        public Merchandise(int cost, int tradeFloor, int value){
    
    
            this.cost = cost;
            this.tradeFloor = tradeFloor;
            this.value = value;
        }
	}

    public static int solve(List<Merchandise> list, int budget, int n){
    
    
        Collections.sort(list, (a, b) -> (a.tradeFloor - a.cost) - (b.tradeFloor - b.cost));
        int[] pkg = new int[budget + 1];
        for (int i = 0; i < n; i++){
    
    
            Merchandise m = list.get(i);
            for (int j = budget; j >= m.tradeFloor; j--){
    
    
                pkg[j] = Math.max(pkg[j], pkg[j - m.cost] + m.value);
            }
        }
        return pkg[budget];
    }

Nota: Primero, debe tradeFloor[i] – cost[i]ordenar según, y luego es básicamente lo mismo que 01 normal, es decir, las condiciones del bucle en la segunda capa de bucles deben reemplazarse cost[i], tradeFloor[i]es decir, las condiciones de la transacción solo se pueden negociar cuando Se cumplen las condiciones de la transacción.


4. Mochila completa

  1. Explicación: La cantidad de todo es infinita.

  2. oficial:

    public static int solve(int[] costs, int[] values, int budget, int n){
    
    
        int[] pkg = new int[budget + 1];
        for (int i = 0; i < n; i++){
    
    
            for (int j = costs[i]; j <= budget; j++)
                pkg[j] = Math.max(pkg[j], pkg[j - costs[i]] + values[i]);
        }
        return pkg[budget];
	}

Nota: La diferencia entre la mochila 01 y la mochila 01 es que la mochila 01 disminuye en orden inverso, mientras que la mochila completa aumenta en orden.


5. Mochila completa variante

  1. Explicación: Encuentre la cantidad mínima de valor que se puede instalar e instale el que tenga el rendimiento de menor costo.

  2. oficial:

    public static int solve(int[] costs, int[] values, int budget, int n, int maxCost){
    
    
        int[] pkg = new int[budget + 1];
        Arrays.fill(pkg, 1, budget + 1, maxCost + 1);
        for (int i = 0; i < n; i++){
    
    
            for (int j = costs[i]; j <= budget; j++){
    
    
                pkg[j] = Math.min(pkg[j], pkg[j - costs[i]] + values[i]);
            }
        }
        return pkg[budget];
	}

Nota:
   Debido a que cuando se busca el máximo, Integer.minValue + no se desbordará, pero Integer.maxValue + cualquier número se desbordará, por lo que hay un parámetro adicional maxCost, que es el precio máximo. MaxCost + 1 debe usarse al completar la matriz inicial., para determinar si hay un resultado factible, determine si el valor de retorno es igual a maxCost + 1. Si es igual, no existe. De lo contrario, el valor de retorno es el valor mínimo requerido.
  ②La diferencia con el valor máximo es que Integer.MinValue ya no se usa para llenar la matriz, sino que se usa el valor positivo anterior maxCost + 1. Max ya no se usa para comparar y en su lugar se usa min.
   Hay un error en Arrays.fill, que no incluye toIndex al completar.


6. Mochila bidimensional

  1. Explicación: El costo y el presupuesto tienen dos dimensiones, como la calidad y el volumen.

  2. Fórmula: (se muestra una mochila completa bidimensional)

    public static int solve(int[] costs1, int[] costs2, int[] values, int budget1, int budget2, int n) {
    
    
        int[][] pkg = new int[budget1 + 1][budget2 + 1];
        for (int i = 0; i < n; i++) {
    
    
            for (int j = costs1[i]; j <= budget1; j++) {
    
    
                for (int k = costs2[i]; k <= budget2; k++) {
    
    
                    pkg[j][k] = Math.max(pkg[j][k], pkg[j - costs1[i]][k - costs2[i]] + values[i]);
                }
            }
        }
        return pkg[budget1][budget2];
	}

Nota: Con una dimensión más, el vector solución tiene una dimensión más y el bucle tiene una capa más.


7. Mochilas grupales

  1. Nota: Hay varios grupos de elementos. Solo puede elegir un elemento de cada grupo o no puede elegir ninguno.

  2. oficial:

    private static class CostAndValue{
    
    
        int cost;
        int value;
        public CostAndValue(int cost, int value){
    
    
            this.cost = cost;
            this.value = value;
        }
    }

    public static int solve(List<List<CostAndValue>> groups, int budget) {
    
    
        int[] pkg = new int[budget + 1];
        groups.forEach((group) -> {
    
    
            for (int j = budget; j >= 0; j--) {
    
    
                for (CostAndValue cav : group) {
    
    
                    if (j >= cav.cost) {
    
    
                        pkg[j] = Math.max(pkg[j], pkg[j - cav.cost] + cav.value);
                    }
                }
            }
        });
        return pkg[budget];
	}

Nota: preste atención a la estructura del bucle de tres capas más un juicio

	for (所有的组k)
	    for (int j = V; j >= 0; j--)
	        for (所有属于组k的i)
	            if (j >= w[i])
	            	f[j] = max(f[j], f[j - w[i]] + v[i])

8. Precaución

Durante la inicialización pkg, si es necesario consumir el resultado , se budgetrequieren pkg[0] = 0todos los demás bits Integer.MIN_VALUE. Si no es necesario consumirlo budget, todos los demás bits están 0bien.


posdata

Estos son varios problemas de mochilas que encuentran los blogueros en combate real y sus soluciones, espero que sean de utilidad para todos.

Supongo que te gusta

Origin blog.csdn.net/Mr_Megamind/article/details/131503234
Recomendado
Clasificación