Tabla de contenido
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:
- Haga clic aquí para volver al índice de artículos de esta columna.
- 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
-
Nota: Sólo hay uno de todo, puedes elegir instalarlo o no.
-
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
-
Explicación: La cantidad de cada cosa es diferente, es un número finito
-
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
cost
decirvalue
(como un cierto volumen de carros de bueyes tirando pasto, cuanto mayor sea el volumen, mejor), al llamar a estesolve
momento, los dos primeros parámetros se pueden pasarcost
ovalue
;
3. Variante 01 Mochila 2
-
Nota: Hay un límite de transacción más
tradeFloor
, es decir,budget
debe ser mayor que 1tradeFloor[i]
antes decost[i]
poder comprar el artículo i. Para obtener más detalles, consulte Comerciantes orgullosos. -
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 reemplazarsecost[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
-
Explicación: La cantidad de todo es infinita.
-
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
-
Explicación: Encuentre la cantidad mínima de valor que se puede instalar e instale el que tenga el rendimiento de menor costo.
-
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
-
Explicación: El costo y el presupuesto tienen dos dimensiones, como la calidad y el volumen.
-
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
-
Nota: Hay varios grupos de elementos. Solo puede elegir un elemento de cada grupo o no puede elegir ninguno.
-
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 budget
requieren pkg[0] = 0
todos los demás bits Integer.MIN_VALUE
. Si no es necesario consumirlo budget
, todos los demás bits están 0
bien.
posdata
Estos son varios problemas de mochilas que encuentran los blogueros en combate real y sus soluciones, espero que sean de utilidad para todos.