Skip to content

Commit f261ce6

Browse files
committed
Chapter 09 section 05 C++ codes updated. Java codes added.
1 parent e26d789 commit f261ce6

File tree

4 files changed

+124
-29
lines changed

4 files changed

+124
-29
lines changed

09-Dynamic-Programming/Course Code (C++)/05-0-1-knapsack/main.cpp

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,59 @@
44

55
using namespace std;
66

7+
/// 背包问题
8+
/// 记忆化搜索
9+
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
10+
/// 空间复杂度: O(n * C)
711
class Knapsack01{
812

913
private:
1014
vector<vector<int>> memo;
1115

1216
// 用 [0...index]的物品,填充容积为c的背包的最大价值
13-
int bestValue(const vector<int> &w, const vector<int> v, int index, int c){
17+
int bestValue(const vector<int> &w, const vector<int> &v, int index, int c){
1418

15-
if( c <= 0 || index < 0 )
19+
if(c <= 0 || index < 0)
1620
return 0;
1721

18-
if( memo[index][c] != -1 )
22+
if(memo[index][c] != -1)
1923
return memo[index][c];
2024

2125
int res = bestValue(w, v, index-1, c);
22-
if( c >= w[index] )
23-
res = max( res , v[index] + bestValue(w, v, index-1, c-w[index]) );
26+
if(c >= w[index])
27+
res = max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));
2428
memo[index][c] = res;
2529
return res;
2630
}
31+
2732
public:
2833
int knapsack01(const vector<int> &w, const vector<int> &v, int C){
29-
assert( w.size() == v.size() && C >= 0 );
34+
assert(w.size() == v.size() && C >= 0);
3035
int n = w.size();
31-
if( n == 0 || C == 0 )
36+
if(n == 0 || C == 0)
3237
return 0;
3338

34-
memo = vector<vector<int>>( n, vector<int>(C+1,-1));
35-
return bestValue(w, v, n-1, C);
39+
memo.clear();
40+
for(int i = 0 ; i < n ; i ++)
41+
memo.push_back(vector<int>(C + 1, -1));
42+
return bestValue(w, v, n - 1, C);
3643
}
3744
};
3845

3946
int main() {
4047

4148
int n, W;
42-
cin>>n>>W;
49+
cin >> n >> W;
4350

44-
int v,w;
51+
int v, w;
4552
vector<int> vs, ws;
46-
for( int i = 0 ; i < n ; i ++ ){
47-
cin>>w>>v;
53+
for(int i = 0 ; i < n ; i ++){
54+
cin >> w >> v;
4855
vs.push_back(v);
4956
ws.push_back(w);
5057
}
5158

52-
cout<<Knapsack01().knapsack01(ws,vs,W)<<endl;
59+
cout << Knapsack01().knapsack01(ws, vs, W) << endl;
60+
5361
return 0;
5462
}

09-Dynamic-Programming/Course Code (C++)/05-0-1-knapsack/main2.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,48 @@
44

55
using namespace std;
66

7+
/// 背包问题
8+
/// 动态规划
9+
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
10+
/// 空间复杂度: O(n * C)
711
class Knapsack01{
812

913
public:
1014
int knapsack01(const vector<int> &w, const vector<int> &v, int C){
11-
assert( w.size() == v.size() && C >= 0 );
15+
assert(w.size() == v.size() && C >= 0);
1216
int n = w.size();
13-
if( n == 0 || C == 0 )
17+
if(n == 0 || C == 0)
1418
return 0;
1519

16-
vector<vector<int>> memo( n, vector<int>(C+1,0));
20+
vector<vector<int>> memo(n, vector<int>(C + 1,0));
1721

18-
for( int j = 0 ; j <= C ; j ++ )
19-
memo[0][j] = ( j >= w[0] ? v[0] : 0 );
22+
for(int j = 0 ; j <= C ; j ++)
23+
memo[0][j] = (j >= w[0] ? v[0] : 0 );
2024

21-
for( int i = 1 ; i < n ; i ++ )
22-
for( int j = 0 ; j <= C ; j ++ ){
25+
for(int i = 1 ; i < n ; i ++)
26+
for(int j = 0 ; j <= C ; j ++){
2327
memo[i][j] = memo[i-1][j];
24-
if( j >= w[i] )
25-
memo[i][j] = max( memo[i][j], v[i] + memo[i-1][j-w[i]]);
28+
if(j >= w[i])
29+
memo[i][j] = max(memo[i][j], v[i] + memo[i - 1][j - w[i]]);
2630
}
27-
return memo[n-1][C];
31+
return memo[n - 1][C];
2832
}
2933
};
3034

3135
int main() {
3236

3337
int n, W;
34-
cin>>n>>W;
38+
cin >> n >> W;
3539

36-
int v,w;
40+
int v, w;
3741
vector<int> vs, ws;
38-
for( int i = 0 ; i < n ; i ++ ){
39-
cin>>w>>v;
42+
for(int i = 0 ; i < n ; i ++){
43+
cin >> w >> v;
4044
vs.push_back(v);
4145
ws.push_back(w);
4246
}
4347

44-
cout<<Knapsack01().knapsack01(ws,vs,W)<<endl;
48+
cout << Knapsack01().knapsack01(ws, vs, W) << endl;
49+
4550
return 0;
4651
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/// 背包问题
2+
/// 记忆化搜索
3+
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
4+
/// 空间复杂度: O(n * C)
5+
public class Solution1 {
6+
7+
private int[][] memo;
8+
9+
public int knapsack01(int[] w, int[] v, int C){
10+
11+
if(w == null || v == null || w.length != v.length)
12+
throw new IllegalArgumentException("Invalid w or v");
13+
14+
if(C < 0)
15+
throw new IllegalArgumentException("C must be greater or equal to zero.");
16+
17+
int n = w.length;
18+
if(n == 0 || C == 0)
19+
return 0;
20+
21+
memo = new int[n][C + 1];
22+
return bestValue(w, v, n - 1, C);
23+
}
24+
25+
// 用 [0...index]的物品,填充容积为c的背包的最大价值
26+
private int bestValue(int[] w, int[] v, int index, int c){
27+
28+
if(c <= 0 || index < 0)
29+
return 0;
30+
31+
if(memo[index][c] != -1)
32+
return memo[index][c];
33+
34+
int res = bestValue(w, v, index-1, c);
35+
if(c >= w[index])
36+
res = Math.max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));
37+
38+
return memo[index][c] = res;
39+
}
40+
41+
public static void main(String[] args) {
42+
43+
}
44+
45+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/// 背包问题
2+
/// 动态规划
3+
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
4+
/// 空间复杂度: O(n * C)
5+
public class Solution2 {
6+
7+
public int knapsack01(int[] w, int[] v, int C){
8+
9+
if(w == null || v == null || w.length != v.length)
10+
throw new IllegalArgumentException("Invalid w or v");
11+
12+
if(C < 0)
13+
throw new IllegalArgumentException("C must be greater or equal to zero.");
14+
15+
int n = w.length;
16+
if(n == 0 || C == 0)
17+
return 0;
18+
19+
int[][] memo = new int[n][C + 1];
20+
21+
for(int j = 0 ; j <= C ; j ++)
22+
memo[0][j] = (j >= w[0] ? v[0] : 0 );
23+
24+
for(int i = 1 ; i < n ; i ++)
25+
for(int j = 0 ; j <= C ; j ++){
26+
memo[i][j] = memo[i-1][j];
27+
if(j >= w[i])
28+
memo[i][j] = Math.max(memo[i][j], v[i] + memo[i - 1][j - w[i]]);
29+
}
30+
31+
return memo[n - 1][C];
32+
}
33+
34+
public static void main(String[] args) {
35+
36+
}
37+
}

0 commit comments

Comments
 (0)