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