Skip to content

Commit 5ddea12

Browse files
authored
Add files via upload
1 parent 080df46 commit 5ddea12

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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

Comments
 (0)