给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行:
第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
第二行为n个正整数A[i](32位整数),以空格隔开。
输出描述:出所求的方案数
示例1
输入
5 15
5 5 10 2 3
输出
4
解题思路:dp解决:
以每个物品作为纵轴,以背包容量作为横轴
0 1 2 3 4 5 6..........
0 1 0 0 0 0 0 0..........
5 1 0 0 0 0 1 0
其中1表示前n件物品放入容量为M的背包有1种方法,(5,0)表示重量为5的物品放入容量为0的背包的背包有1中方法,
即不放入。0表示恰好放满背包的方法为0
当M>weight[i]时,dp[M]=dp[M]+dp[M-weight[i]];意义是:放入物品i和不放入物品i的方法总和
import java.util.Scanner;
//数字和为sum的方法数
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = sc.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = sc.nextInt();
}
long[] dp = new long[sum+1];
dp[0] = 1;
for(int i=0;i<n;i++){
for(int j=sum;j>=arr[i];j--){
dp[j] += dp[j-arr[i]];
}
}
System.out.println(dp[sum]);
}
}