Skip to content

Commit 3da4497

Browse files
committed
Chapter 09 C++ codes added.
1 parent f261ce6 commit 3da4497

File tree

4 files changed

+109
-28
lines changed

4 files changed

+109
-28
lines changed

09-Dynamic-Programming/Course Code (C++)/06-0-1-knapsack-optimized/main.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(C), 实际使用了2*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();
1317
if( n == 0 && C == 0 )
1418
return 0;
1519

16-
vector<vector<int>> memo( 2, vector<int>(C+1,0));
20+
vector<vector<int>> memo(2, 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 ++ ){
23-
memo[i%2][j] = memo[(i-1)%2][j];
24-
if( j >= w[i] )
25-
memo[i%2][j] = max( memo[i%2][j], v[i] + memo[(i-1)%2][j-w[i]]);
25+
for(int i = 1 ; i < n ; i ++)
26+
for(int j = 0 ; j <= C ; j ++){
27+
memo[i % 2][j] = memo[(i-1) % 2][j];
28+
if(j >= w[i])
29+
memo[i % 2][j] = max(memo[i % 2][j], v[i] + memo[(i-1) % 2][j - w[i]]);
2630
}
27-
return memo[(n-1)%2][C];
31+
return memo[(n-1) % 2][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
}

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

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,27 @@
44

55
using namespace std;
66

7+
/// 背包问题
8+
/// 动态规划改进
9+
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
10+
/// 空间复杂度: O(C), 只使用了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 );
12-
int n = w.size();
13-
if( n == 0 || C == 0 )
15+
assert(w.size() == v.size() && C >= 0);
16+
intn = w.size();
17+
if(n == 0 || C == 0)
1418
return 0;
1519

1620
vector<int> memo(C+1,0);
1721

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

21-
for( int i = 1 ; i < n ; i ++ )
22-
for( int j = C ; j >= w[i] ; j -- )
23-
memo[j] = max( memo[j], v[i] + memo[j-w[i]]);
25+
for(int i = 1 ; i < n ; i ++)
26+
for(int j = C ; j >= w[i] ; j --)
27+
memo[j] = max(memo[j], v[i] + memo[j - w[i]]);
2428

2529
return memo[C];
2630
}
@@ -29,16 +33,17 @@ class Knapsack01{
2933
int main() {
3034

3135
int n, W;
32-
cin>>n>>W;
36+
cin >> n >> W;
3337

34-
int v,w;
38+
int v, w;
3539
vector<int> vs, ws;
36-
for( int i = 0 ; i < n ; i ++ ){
37-
cin>>w>>v;
40+
for(int i = 0 ; i < n ; i ++){
41+
cin >> w >> v;
3842
vs.push_back(v);
3943
ws.push_back(w);
4044
}
4145

42-
cout<<Knapsack01().knapsack01(ws,vs,W)<<endl;
46+
cout << Knapsack01().knapsack01(ws, vs, W) << endl;
47+
4348
return 0;
4449
}
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(C), 实际使用了2*C的额外空间
5+
public class Solution1 {
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[2][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 % 2][j] = memo[(i-1) % 2][j];
27+
if(j >= w[i])
28+
memo[i % 2][j] = Math.max(memo[i % 2][j], v[i] + memo[(i-1) % 2][j - w[i]]);
29+
}
30+
31+
return memo[(n-1) % 2][C];
32+
}
33+
34+
public static void main(String[] args) {
35+
36+
}
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/// 背包问题
2+
/// 动态规划改进
3+
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
4+
/// 空间复杂度: O(C), 只使用了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[C+1];
20+
21+
for(int j = 0 ; j <= C ; j ++)
22+
memo[j] = (j >= w[0] ? v[0] : 0);
23+
24+
for(int i = 1 ; i < n ; i ++)
25+
for(int j = C ; j >= w[i] ; j --)
26+
memo[j] = Math.max(memo[j], v[i] + memo[j - w[i]]);
27+
28+
return memo[C];
29+
}
30+
31+
public static void main(String[] args) {
32+
33+
}
34+
}

0 commit comments

Comments
 (0)