1
+ package CampusRecruitment2019 ;
2
+
3
+ import java .io .BufferedReader ;
4
+ import java .io .IOException ;
5
+ import java .io .InputStreamReader ;
6
+ import java .util .Arrays ;
7
+ import java .util .Scanner ;
8
+
9
+
10
+ // 牛牛的背包问题
11
+ public class Main008 {
12
+ public static void main (String [] args ) throws IOException {
13
+ BufferedReader bufferedReader = new BufferedReader (new InputStreamReader (System .in ));
14
+
15
+ String [] str1 = bufferedReader .readLine ().split (" " );
16
+ int n = Integer .parseInt (str1 [0 ]);
17
+ long w = Long .parseLong (str1 [1 ]);
18
+
19
+ String [] str2 = bufferedReader .readLine ().split (" " );
20
+ long [] v = new long [n ];
21
+ for (int i = 0 ; i < n ; i ++)
22
+ v [i ] = Long .parseLong (str2 [i ]);
23
+
24
+ // 计算零食体积总和,总和小于等于背包容量,则有2^n种
25
+ long sum = 0 ;
26
+ for (long l : v )
27
+ sum += l ;
28
+ if (sum <= w ) {
29
+ System .out .println ((long ) Math .pow (2 , n ));
30
+ return ;
31
+ }
32
+ // 否则,递归累加计算
33
+ System .out .println (loop (v , n - 1 , w ));
34
+ }
35
+
36
+ private static int loop (long [] v , int i , long w ) {
37
+ // 边界条件,最后一袋零食
38
+ if (i == 0 ) {
39
+ // 背包容量≥零食体积,可选择放入或不放入两种情况
40
+ if (w >= v [0 ])
41
+ return 2 ;
42
+ // 只能选择不放入一种情况
43
+ else
44
+ return 1 ;
45
+ }
46
+ // 边界条件,背包容量为0,只能选择不放入一种情况
47
+ if (w == 0 )
48
+ return 1 ;
49
+
50
+ // 背包容量足够装下这袋零食,则可选择放入或不放入
51
+ if (w - v [i ] >= 0 )
52
+ return loop (v , i - 1 , w - v [i ]) + loop (v , i - 1 , w );
53
+ // 否则,只能选择不放入
54
+ else
55
+ return loop (v , i - 1 , w );
56
+ }
57
+ }
58
+
59
+
60
+
61
+ /*
62
+ // 动态规划,二维数组
63
+ public class Main008 {
64
+ public static void main(String[] args) {
65
+ Scanner sc = new Scanner(System.in);
66
+ int n = sc.nextInt(), w = sc.nextInt();
67
+ int[] v = new int[n];
68
+ for (int i = 0; i < n; i++) {
69
+ v[i] = sc.nextInt();
70
+ }
71
+
72
+ int[][] dp = new int[n + 1][w + 1];
73
+ for (int i = 0; i < n + 1; i++) {
74
+ dp[i][0] = 1;
75
+ }
76
+ for (int j = 0; j <= w; j++) {
77
+ dp[0][j] = 1;
78
+ }
79
+ for (int i = 1; i <= n; i++) {
80
+ for (int j = 1; j <= w; j++) {
81
+ dp[i][j] = dp[i - 1][j];
82
+ if (j - v[i - 1] >= 0) {
83
+ dp[i][j] += dp[i - 1][j - v[i - 1]];
84
+ }
85
+ }
86
+ }
87
+ System.out.println(dp[n][w]);
88
+ }
89
+ }
90
+ */
91
+
92
+
93
+
94
+ /*
95
+ // 动态规划,一维数组
96
+ public class Main008 {
97
+ public static void main(String[] args) {
98
+ Scanner sc = new Scanner(System.in);
99
+ int n = sc.nextInt();
100
+ int w = sc.nextInt();
101
+ int[] v = new int[n];
102
+ for (int i = 0; i < n; i++) {
103
+ v[i] = sc.nextInt();
104
+ }
105
+
106
+ int[] dp = new int[w + 1];
107
+ Arrays.fill(dp, 1);
108
+ for (int i = 0; i < n; i++) {
109
+ for (int j = w; j >= v[i]; j--) {
110
+ dp[j] = dp[j] + dp[j - v[i]];
111
+ }
112
+ }
113
+ System.out.println(dp[w]);
114
+ }
115
+ }
116
+ */
0 commit comments