Ejemplo n.º 1
0
 @Override
 public HashMap4<K1, K2, K3, K4, V> clone() {
   HashMap4<K1, K2, K3, K4, V> copia = new HashMap4<K1, K2, K3, K4, V>();
   // copia.tabla = (HashMap<Par, V>) tabla.clone();
   copia.tabla = new HashMap<Par, V>(tabla);
   return copia;
 }
Ejemplo n.º 2
0
  // Recursivo con ramificación y poda (se añade un parámetro más) y programación dinámica (pero sin
  // tener en cuenta ese parámetro).
  private static int best(int k, int T1, int T2, int diferencia) {
    // Si la llamada recursiva no es potencialmente mejor que la solución obtenida hasta ahora, se
    // descarta.
    int suma = 0;
    for (int i = k; i < N; i++) {
      if (n[i] <= T1 || n[i] <= T2) suma += n[i];
    }
    int cota = (T1i + T2i - T1 - T2) + Math.min(T1 + T2, suma);
    if (cota <= maximoActual || Math.abs(diferencia) > D + (N - k)) {
      return 0;
    }

    if (k == N) {
      if (Math.abs(diferencia) <= D) {
        // (T1i + T2i - T1 - T2) -> es el total de cargamento que estoy transportando
        if ((T1i + T2i - T1 - T2) > maximoActual) {
          maximoActual = (T1i + T2i - T1 - T2);
        }
        return (T1i + T2i - T1 - T2);
      } else {
        return 0;
      }
    } else {
      // Caso en el que se descarta el bloque.
      int caso1;
      if (tabla.containsKey(k + 1, T1, T2, diferencia)) {
        caso1 = tabla.get(k + 1, T1, T2, diferencia);
      } else {
        caso1 = best(k + 1, T1, T2, diferencia);
        tabla.put(k + 1, T1, T2, diferencia, caso1);
      }
      int maximo = caso1;

      // Caso en el que el bloque se introduce en el camión 1 (si cabe).
      if (T1 >= n[k]) {
        int caso2;
        if (tabla.containsKey(k + 1, T1 - n[k], T2, diferencia + 1)) {
          caso2 = tabla.get(k + 1, T1 - n[k], T2, diferencia + 1);
        } else {
          caso2 = best(k + 1, T1 - n[k], T2, diferencia + 1);
          tabla.put(k + 1, T1 - n[k], T2, diferencia + 1, caso2);
        }
        maximo = Math.max(maximo, caso2);
      }

      // Caso en el que el bloque se introduce en el camión 2 (si cabe).
      if (T2 >= n[k]) {
        int caso3;
        if (tabla.containsKey(k + 1, T1, T2 - n[k], diferencia - 1)) {
          caso3 = tabla.get(k + 1, T1, T2 - n[k], diferencia - 1);
        } else {
          caso3 = best(k + 1, T1, T2 - n[k], diferencia - 1);
          tabla.put(k + 1, T1, T2 - n[k], diferencia - 1, caso3);
        }
        maximo = Math.max(maximo, caso3);
      }

      return maximo;
    }
  }