問題を解決するための動的計画法:合計の方法の数と数

タイトルの説明:
合計数は、合計の方法の数です(n個の正の整数と整数の合計を持つ配列Aが与えられた場合、配列Aのいくつかの数の合計が合計であるオプションの数を見つけます。2つの場合オプションには1つの数字があります添え字が同じでない場合は、異なる構成スキームであると考えられます。)

入力の説明:
入力は2行です。
最初の行は2つの正の整数n(1≤n≤1000)で、
2番目の行はスペースで区切られたn個の正の整数Aiです。

例1
入力515
5 5 10 23
出力
4

この問題は実際には少し厄介です。この問題をよりよく解決するために、推奨される方法はもちろん動的計画法です:動的計画法
の中心的なアイデアは、大きな問題をサブ問題に分解し、サブ問題を解決することです、次に、サブ質問への回答を組み合わせて、最終的な質問への回答を取得します。

動的計画法を使用しない場合は、順列や組み合わせと同様に元の方法を使用するため、その複雑さは非常に高くなります。

ここでは、動的計画法のソリューションに焦点を当てます。
ここに画像の説明を挿入します

上記は動的計画法を使用して取得されたテーブルであり、最終的に配列の最後の値が成功します。

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

おすすめ

転載: blog.csdn.net/weixin_43815275/article/details/113555185