Descripción del título: el
número de sumas es el número de métodos de suma (dada una matriz A con n números enteros positivos y una suma entera, encuentre el número de opciones en las que la suma de algunos números de la matriz A es suma. Cuando los dos las opciones tienen un número Si el subíndice no es el mismo, pensamos que es un esquema de composición diferente.)
Descripción de la entrada: La
entrada son dos líneas: la
primera línea son dos enteros positivos n (1 ≤ n ≤ 1000) y la
segunda línea son n enteros positivos Ai , separados por espacios.
Ejemplo 1
Entrada
5 15 5 5 10 2 3
Salida
4
Este problema es en realidad un poco incómodo. Para resolver mejor este problema, el método preferido es, por supuesto, la programación dinámica:
la idea central de la programación dinámica es descomponer el gran problema en subproblemas, resolver los subproblemas, y luego se combinan las respuestas a las subpreguntas para obtener la respuesta a la pregunta final.
Si no usamos programación dinámica, usaremos el método original, similar a la permutación y combinación, y su complejidad es muy alta.
Aquí se centra en la solución de la programación dinámica.
Lo anterior es la tabla obtenida mediante programación dinámica, y finalmente el último valor del arreglo es exitoso.
package pracetice;
import java.util.Scanner;
public class Dp {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int sum=sc.nextInt();
int[] num=new int[n];
for(int i=0;i<n;i++){
num[i]=sc.nextInt();
}
System.out.println(getCount(num, sum));
}
private static long getCount(int[] num, int sum) {
long[][] arr=new long[num.length+1][sum+1];
for(int i=0;i<=num.length;i++){
arr[i][0]=1;
}
for(int j=1;j<=sum;j++){
arr[0][j]=0;
}
for(int i=1;i<arr.length;i++){
for(int j=1;j<arr[0].length;j++){
if(num[i-1]<=j){
arr[i][j]=arr[i-1][j]+arr[i-1][j-num[i-1]];
}
else{
arr[i][j]=arr[i-1][j];
}
}
}
return arr[num.length][sum];
}
}