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];
}
}