数字和为sum的方案数

问题描述:
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行: 第一行为两个正整数n,sum,第二行为n个正整数A[i](32位整数),以空格隔开。
输出描述:
输出所求的方案数
示例1
输入
3 40
20 20 20
输出
3

 代码如下:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            int n = sc.nextInt();
            int[] arr = new int[n+1];
            //该数组第一个元素为0,其余元素为要输入的元素
            arr[0] = 0;
            for(int i = 1;i<=n;i++){
                arr[i] = sc.nextInt();
            }
            System.out.println(nNumAddSumCount(arr,40));
        }
        
    }

    public static long nNumAddSumCount(int[] arr,int sum){
        int n = arr.length;
        //定义二维数组,用来表示方法数
        long[][] dp = new long[n+1][sum+1];
        //对第一列全部赋1
        for(int i = 0;i<=n;i++){
            dp[i][0] = 1;
        }
        //对第一行除第一个位置外其余赋0
        for(int i = 1;i<=sum;i++){
            dp[0][i] = 0;
        }
        for(int i = 1;i<=n;i++){
            for(int j = 1;j<=sum;j++){
                //如果arr[i]>j,此时(i,j)位置的值为(i-1,j)位置的值
                if(arr[i-1]>j){
                    dp[i][j] = dp[i-1][j];
                }else{
                    dp[i][j] = dp[i-1][j]+dp[i-1][j-arr[i-1]];
                }
            }
        }
        return dp[n][sum];
    }
}
原文地址:https://www.cnblogs.com/du001011/p/10919053.html