Skip to content

Commit e778296

Browse files
authored
Update pack.cpp
Your PR can't be compiled, I modified some code. 1. Added the definition of T 2. Added delete heap variables 3. packIterative and printT separate two functions to uncouple code
1 parent e5b43e7 commit e778296

File tree

1 file changed

+44
-30
lines changed

1 file changed

+44
-30
lines changed

Problems/KnapsackProblem/pack.cpp

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,31 @@
22
#include <algorithm>
33
using namespace std;
44

5+
int **T = NULL; // 存储背包问题表格的数组指针
6+
57
// 返回两个值的最大值
68
int max(int a, int b) {
79
return (a > b) ? a : b;
810
}
911

1012
// 迭代法,能显示背包问题的表格
1113
int packIterative(int n, int W, int *w, int *v) {
14+
1215
// 循环遍历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+
{
1518
// 循环遍历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+
{
2021
//第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+
2425
// 第i个物品不能装下,则递归装i-1个
25-
else {
26+
else
2627
T[i][j] = T[i - 1][j];
27-
}
2828
}
2929
}
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-
}
4430
return T[n][W];
4531
}
4632

@@ -51,15 +37,34 @@ int packRecursive(int n, int W, int *w, int *v) {
5137
return 0;
5238
}
5339
// 第i个物品不能装下,则递归装i-1个
54-
if (w[i] > W) {
40+
if (w[n] > W) {
5541
return packRecursive(n - 1, W, w, v);
5642
}
5743
//第i个物品能装下,则比较包括第i个物品和不包括第i个物品,取其最大值
5844
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));
6046
}
6147
}
6248

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+
}
6368

6469
int main() {
6570
int *w = NULL; // 存储每件物品重量的数组指针
@@ -94,8 +99,8 @@ int main() {
9499

95100
// 分配空间
96101
// 对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];
99104

100105
// 对T分配n+1行,并初始化为0
101106
T = new int *[n + 1]();
@@ -108,7 +113,7 @@ int main() {
108113
// 输入背包的重量和价值
109114
for (auto i = 1; i <= n; i++)
110115
{
111-
cout << "请输入第 " << i << " 个背包的重量和价值(用空格隔开)" << endl;
116+
cout << "请输入第 " << i << " 个物品的重量和价值(用空格隔开)" << endl;
112117
cin >> w[i] >> v[i];
113118
if (cin.fail() || w[i] < 0 || v[i] < 0)
114119
{
@@ -134,6 +139,8 @@ int main() {
134139
{
135140
// 迭代法,能显示背包问题的表格
136141
cout << "能装下物品的最大价值为 " << packIterative(n, W, w, v) << endl;
142+
cout << "------------------------------------------------" << endl;
143+
printT(n, W);
137144
break;
138145
}
139146
case 2:
@@ -151,6 +158,13 @@ int main() {
151158

152159
cout << "------------------------------------------------" << endl;
153160

161+
delete w;
162+
delete v;
163+
for (int i = 0; i <= n; ++i) {
164+
delete[] T[i];
165+
}
166+
delete[] T;
167+
154168
system("pause");
155169
return 0;
156170
}

0 commit comments

Comments
 (0)