@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; }
// 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; } }