両替---リュックサック


changesのすべての値が正数で重複しない配列changesがあります.各値は1つの額面の通貨を表し、各額面の通貨は任意の枚を使用することができ、1つの与えられた値xに対して、この値を構成するシナリオ数を計算する効率的なアルゴリズムを設計してください.int配列changesが与えられ、したがって小銭を表すとともに、その大きさnが与えられ、正の整数xが与えられ、nが100未満であり、xが10000未満であることを保証するxを構成するスキーム数を返します.テストサンプル:4 15 5 10 25 1戻り:6テストサンプル:4 0 5 10 5 1戻り:1
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int x=sc.nextInt();
        int changes[]=new int[n];
        for(int i=0;i//-------------------- -----------------------
        int[][]dp=new int[n][x+1];// i j 
        for(int i=0;i// 0 
            dp[i][0]=1;
        }
        for(int j=1;j<=x;j++){// j 1 
            if(j%changes[0]==0){
                dp[0][j]=1;
            }
        }
        //---------------------- -----------------------
        for(int i=1;i//changes[i] 
            for(int j=1;j<=x;j++){// 
                dp[i][j]=dp[i-1][j];
                if(j-changes[i]>=0){// changes[i]
                    dp[i][j]+=dp[i][j-changes[i]];
                }
            }
        }
        System.out.println(dp[n-1][x]);
    }
}