[Poda de retroceso] Encuentra la combinación de todas las sumas en una matriz como destino


Prefacio

La pregunta de hoy es una lección dolorosa. La idea es correcta, pero se omiten las condiciones del ciclo. Se puede escribir a mano, pero ...
Inserte la descripción de la imagen aquí


tema

Encuentre la combinación de todas las sumas en una matriz como objetivo

Por ejemplo, la matriz es [2,2,3,4] y target = 7,
entonces todas las combinaciones son
[2,2,3], [3,4]


Ideas

Retrocediendo poda, atravesando todas las situaciones, plantilla dfs pregunta
suma guarda la suma temporal, tmp guarda la combinación temporal, índice recurre a la profundidad actual.
Si suma == objetivo, la tmp actual es una combinación legal y se agrega al conjunto de respuestas.
Si sum + arr [index] ya es mayor que target, no hay necesidad de agregar arr [index] en este momento y regresar directamente. (Esta operación representa la poda)
Si index == arr.length, debe regresar, porque la matriz estará fuera de los límites (esto representa la verificación de la condición de límite)

Es necesario recorrer la posición de cada matriz y todos deben buscar de forma recursiva. Después de la búsqueda, es necesario retroceder para asegurarse de que todas las combinaciones se pueden encontrar en el siguiente nodo.

Si solo se recorre una vez, después de eliminar el primer elemento, no puede continuar buscando todas las combinaciones de forma recursiva desde el segundo elemento.


Código

public class Solution {
    
    

	//使用Set集合来去重
    static Set<List<Integer>> res = new HashSet<List<Integer>>();
    static List<Integer> tmp = new LinkedList<Integer>();

    public static void main(String[] args) {
    
    
        int[] arr = {
    
    2,2,3,2,4,1,6,5,2,7,0,1,1,1,1,1,1,1};
        int target = 7;
        dfs(arr,target,0,0);
        printResult(res);
    }

    public static void dfs(int[] arr,int target,int sum,int index) {
    
    
        if(sum == target){
    
    
            res.add(new LinkedList<Integer>(tmp));
            return;
        }
        if(index >= arr.length) return;
        if(sum + arr[index] > target) return;
        for(int i = index; i<arr.length; i++) {
    
    
            tmp.add(arr[i]);
            dfs(arr,target,sum+arr[i],i+1);
            tmp.remove(tmp.size()-1);
        }
    }

    public static void printResult(Set<List<Integer>> res) {
    
    
        Iterator iterator = res.iterator();
        while(iterator.hasNext()) {
    
    
            System.out.println(iterator.next());
        }
    }

}


Resultados de la prueba

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


para resumir

Creo que todo el mundo está familiarizado con el retroceso, pero cuando de repente escribe en el acto, necesita tener una mente más clara antes de codificar el código, piénselo dos veces antes de continuar.


Insista en compartir, insista en la originalidad, ¡las chicas bonitas a las que les gustan los blogueros pueden consultar el blog de la página de inicio del blogger!
¡Tus gustos y favoritos son mi mayor agradecimiento por compartir blogs!
Dirección del blog de Blogger: https://blog.csdn.net/weixin_43967679

Supongo que te gusta

Origin blog.csdn.net/weixin_43967679/article/details/114708735
Recomendado
Clasificación