数字和为sum的方法数
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入
5 15
5 5 10 2 3
输出
4
import java.util.Scanner;
public class KK {
public static void main(String[] args) {
// 动态规划求解如下:
/*5 15
*5 5 10 2 3
*4
* sum值是指定的,但是解空间肯定是最小单位为1进行增长, 所以想到dp[i][j]表示前缀为 i ,
* 能组成值为 j 的可能性个数。
* 然后行序求解,如果这个p[i] <= j ,说明有组成 j 的可能,
* p[i] > j ,则dp[i][j] 就是不考虑 p[i]的前 i - 1 个数组成 j 。
*
* dp[i-1][j]+ dp[i-1][j- p[i]] (p[i] <= j)
* dp[i][j] =
* dp[i-1][j] (p[i] > j)
*
*/
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] p = new int[n + 1];
long[][] dp = new long[n + 1][m + 1];// dp[i,j]表示前i个可以凑到j的个数
for (int i = 1; i <= n; i++) {
p[i] = sc.nextIn