package class39; public class Code02_SnacksWays { public static int ways1(int[] arr, int w) { // arr[0...] return process(arr, 0, w); } // 从左往右的经典模型 // 还剩的容量是rest,arr[index...]自由选择, // 返回选择方案 // index : 0~N // rest : 0~w public static int process(int[] arr, int index, int rest) { if (rest < 0) { // 没有容量了 // -1 无方案的意思 return -1; } // rest>=0, if (index == arr.length) { // 无零食可选 return 1; } // rest >=0 // 有零食index // index号零食,要 or 不要 // index, rest // (index+1, rest) // (index+1, rest-arr[i]) int next1 = process(arr, index + 1, rest); // 不要 int next2 = process(arr, index + 1, rest - arr[index]); // 要 return next1 + (next2 == -1 ? 0 : next2); } public static int ways2(int[] arr, int w) { int N = arr.length; int[][] dp = new int[N + 1][w + 1]; for (int j = 0; j <= w; j++) { dp[N][j] = 1; } for (int i = N - 1; i >= 0; i--) { for (int j = 0; j <= w; j++) { dp[i][j] = dp[i + 1][j] + ((j - arr[i] >= 0) ? dp[i + 1][j - arr[i]] : 0); } } return dp[0][w]; } public static int ways3(int[] arr, int w) { int N = arr.length; int[][] dp = new int[N][w + 1]; for (int i = 0; i < N; i++) { dp[i][0] = 1; } if (arr[0] <= w) { dp[0][arr[0]] = 1; } for (int i = 1; i < N; i++) { for (int j = 1; j <= w; j++) { dp[i][j] = dp[i - 1][j] + ((j - arr[i]) >= 0 ? dp[i - 1][j - arr[i]] : 0); } } int ans = 0; for (int j = 0; j <= w; j++) { ans += dp[N - 1][j]; } return ans; } public static void main(String[] args) { int[] arr = { 4, 3, 2, 9 }; int w = 8; System.out.println(ways1(arr, w)); System.out.println(ways2(arr, w)); System.out.println(ways3(arr, w)); } }