Programación dinámica para resolver el problema: el número y el número de métodos para la suma.

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.
Inserte la descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/weixin_43815275/article/details/113555185
Recomendado
Clasificación