La espada se refiere a la oferta 102: el valor objetivo de la suma y la resta

Pregunta:
dada una matriz de números enteros positivos y un objetivo entero.
Se puede construir una expresión agregando un '+' o '-' a cada entero en la matriz y luego concatenando todos los enteros:
por ejemplo, nums = [2, 1], puede agregar un '+' antes de 2, y agregue '+' antes de 1 Agregue '-' antes y luego concatene para obtener la expresión "+2-1".
Devuelve el número de expresiones distintas que se pueden construir mediante los métodos anteriores que se evalúan como objetivo.
Ejemplo 1:
Entrada: nums = [1,1,1,1,1], objetivo = 3
Salida: 5
Explicación: Hay 5 formas de hacer que el objetivo final sume 3.
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
Ejemplo 2:
Entrada: nums = [1], objetivo = 1
Salida: 1
Análisis:
Transforme el problema:Antes de analizar y resolver este problema, necesitamos hacer operaciones matemáticas, agregando "+" a algunos números en la matriz de entrada y "-" a algunos números. Si la suma de todos los números sumados con "+" es p, y la suma de todos los números sumados con "-" es q, de acuerdo con los requisitos del título pq=objetivo, si todos los números en los números se acumulan, la suma de se pueden obtener los números de toda la matriz. Se cuenta como suma, es decir, p+q=suma. Sume estas dos ecuaciones para obtener la fórmula 2p=target+sum=》p=(target+sum)/2, la ecuación anterior muestra que si puede encontrar el número en la matriz que suma (target+sum)/2 , y agregue "+" a ellos, luego agregue "-" a otros números, y el resultado final del cálculo es el objetivo. Entonces, este problema es equivalente a contar el número de formas de seleccionar números de una matriz cuya suma es (objetivo+suma)/2, un típico problema de mochila 0-1.
La idea de esta pregunta es más o menos la misma que la de la 101.
Código:

public class FindTargetSumWays {
    
    
    public static void main(String[] args) {
    
    
        FindTargetSumWays findTargetSumWays = new FindTargetSumWays();
        int[] nums = {
    
    1,1,1,1,1};
        int targetSumWays = findTargetSumWays.findTargetSumWays(nums, 3);
        System.out.println(targetSumWays);
    }
    public int findTargetSumWays(int[] nums, int target) {
    
    
        int sum = 0;
        for (int num : nums) {
    
    
            sum += num;
        }
        if ((sum+target)%2 == 1|| sum<target){
    
    
            return 0;
        }
        return subsetSum(nums,(sum+target)/2);
    }

    private int subsetSum(int[] nums, int target) {
    
    
        int[] dp = new int[target+1];
        dp[0] = 1;
        //如果当前值大于目标值,方法数一定为0
        for (int num:nums){
    
    
            for (int j = target; j >=num ; j--) {
    
    
                dp[j] +=dp[j-num];
            }
        }
        return dp[target];
    }
}

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Jiaodaqiaobiluo/article/details/123284860
Recomendado
Clasificación