大家帮我看一下
下面两段代码有什么区别么,为甚么得到的答案不一样
import java.util.Arrays;
import java.util.Scanner;public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] v = new int[n];
for (int i = 0; i < n; i++) {
v[i] = sc.nextInt();
}
long[] dp = new long[m + 1];
dp[0] = 1;
for (int i = 0; i < n; i++) {
for (int j = m; j >= 0; j--) {
if (j >= v[i]) {
dp[j] += dp[j - v[i]];
}
}
}
System.out.println(dp[m]);
}
}
import java.util.Arrays;
import java.util.Scanner;
/***
*
* @author Mr Zhang 题目描述 给定一个有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
*
*/
public class SumTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] v = new int[n];
for (int i = 0; i < n; i++) {
v[i] = sc.nextInt();
}
long[] dp = new long[m + 1];
dp[0] = 1;
for (int i = 1; i <= m; i++) {
for (int j = 0; j < v.length; j++) {
if (i >= v[j]) {
dp[i] += dp[i - v[j]];
}
}
}
System.out.println(dp[m]);
}
}
import java.util.Scanner;
/***
*
* @author Mr Zhang 题目描述 给定一个有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
*
*/
public class SumTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] v = new int[n];
for (int i = 0; i < n; i++) {
v[i] = sc.nextInt();
}
long[] dp = new long[m + 1];
dp[0] = 1;
for (int i = 1; i <= m; i++) {
for (int j = 0; j < v.length; j++) {
if (i >= v[j]) {
dp[i] += dp[i - v[j]];
}
}
}
System.out.println(dp[m]);
}
}