2
2
#include < algorithm>
3
3
using namespace std ;
4
4
5
+ int **T = NULL ; // 存储背包问题表格的数组指针
6
+
5
7
// 返回两个值的最大值
6
8
int max (int a, int b) {
7
9
return (a > b) ? a : b;
8
10
}
9
11
10
12
// 迭代法,能显示背包问题的表格
11
13
int packIterative (int n, int W, int *w, int *v) {
14
+
12
15
// 循环遍历n行
13
- int T[i+ 1 ][j+ 1 ];
14
- for ( int i = 0 ; i <= n; ++i) {
16
+ for ( int i = 1 ; i <= n; ++i)
17
+ {
15
18
// 循环遍历W列
16
- for (int j = 0 ; j <= W; ++j) {
17
- if (i == 0 || j == 0 ) {
18
- T[i][j] = 0 ;
19
- }
19
+ for (int j = 1 ; j <= W; ++j)
20
+ {
20
21
// 第i个物品能装下,则比较包括第i个物品和不包括第i个物品,取其最大值
21
- if ( w[i- 1 ] <= j) {
22
- T[i][j] = max (v[i- 1 ] + T[i - 1 ][j - w[i]], T[i - 1 ][j]);
23
- }
22
+ if (w[i] <= j)
23
+ T[i][j] = max (v[i] + T[i - 1 ][j - w[i]], T[i - 1 ][j]);
24
+
24
25
// 第i个物品不能装下,则递归装i-1个
25
- else {
26
+ else
26
27
T[i][j] = T[i - 1 ][j];
27
- }
28
28
}
29
29
}
30
-
31
- for (auto i = 0 ; i <= n; i++) {
32
- // 打印行数
33
- cout << i << " :\t " ;
34
-
35
- // 打印W列
36
- for (int w = 0 ; w <= W; w++)
37
- {
38
- cout << T[i][w] << " \t " ;
39
- }
40
-
41
- // 换行
42
- cout << endl;
43
- }
44
30
return T[n][W];
45
31
}
46
32
@@ -51,15 +37,34 @@ int packRecursive(int n, int W, int *w, int *v) {
51
37
return 0 ;
52
38
}
53
39
// 第i个物品不能装下,则递归装i-1个
54
- if (w[i ] > W) {
40
+ if (w[n ] > W) {
55
41
return packRecursive (n - 1 , W, w, v);
56
42
}
57
43
// 第i个物品能装下,则比较包括第i个物品和不包括第i个物品,取其最大值
58
44
else {
59
- return max (v[i ] + packRecursive (n - 1 , W - w[n], w , v), packRecursive (n - 1 , W, w, v));
45
+ return max (v[n ] + packRecursive (n - 1 , W - w[n], w, v), packRecursive (n - 1 , W, w, v));
60
46
}
61
47
}
62
48
49
+ // 打印背包问题的表格
50
+ void printT (int n, int W)
51
+ {
52
+ // 打印n行
53
+ for (auto i = 0 ; i <= n; i++)
54
+ {
55
+ // 打印行数
56
+ cout << i << " :\t " ;
57
+
58
+ // 打印W列
59
+ for (int w = 0 ; w <= W; w++)
60
+ {
61
+ cout << T[i][w] << " \t " ;
62
+ }
63
+
64
+ // 换行
65
+ cout << endl;
66
+ }
67
+ }
63
68
64
69
int main () {
65
70
int *w = NULL ; // 存储每件物品重量的数组指针
@@ -94,8 +99,8 @@ int main() {
94
99
95
100
// 分配空间
96
101
// 对w和v分配n+1大小
97
- w = new int [n+ 1 ];
98
- v = new int [n+ 1 ];
102
+ w = new int [n + 1 ];
103
+ v = new int [n + 1 ];
99
104
100
105
// 对T分配n+1行,并初始化为0
101
106
T = new int *[n + 1 ]();
@@ -108,7 +113,7 @@ int main() {
108
113
// 输入背包的重量和价值
109
114
for (auto i = 1 ; i <= n; i++)
110
115
{
111
- cout << " 请输入第 " << i << " 个背包的重量和价值 (用空格隔开)" << endl;
116
+ cout << " 请输入第 " << i << " 个物品的重量和价值 (用空格隔开)" << endl;
112
117
cin >> w[i] >> v[i];
113
118
if (cin.fail () || w[i] < 0 || v[i] < 0 )
114
119
{
@@ -134,6 +139,8 @@ int main() {
134
139
{
135
140
// 迭代法,能显示背包问题的表格
136
141
cout << " 能装下物品的最大价值为 " << packIterative (n, W, w, v) << endl;
142
+ cout << " ------------------------------------------------" << endl;
143
+ printT (n, W);
137
144
break ;
138
145
}
139
146
case 2 :
@@ -151,6 +158,13 @@ int main() {
151
158
152
159
cout << " ------------------------------------------------" << endl;
153
160
161
+ delete w;
162
+ delete v;
163
+ for (int i = 0 ; i <= n; ++i) {
164
+ delete[] T[i];
165
+ }
166
+ delete[] T;
167
+
154
168
system (" pause" );
155
169
return 0 ;
156
170
}
0 commit comments