2021.10.17
复习软考的时候,翻看软件设计师考试32小时通关时发现P143页0-1背包问题答案有误,特此记录一下。
结合算法设计与分析课程所学习到的0-1背包求解方法,特此编写一个c++程序求解该问题。
代码如下:
#include <iostream>
using namespace std;
#define n 5 // 商品数量
#define C 100 // 背包容量
int P[n+1][C+1], Rec[n+1][C+1];
void knapsack(int p[], int v[]) // p[n]代表各商品价值,v[n]代表各商品体积
{
for (int i = 0; i <= C; i++) // 初始化
{
P[0][i] = 0;
}
for (int i = 0; i <= n; i++) // 初始化
{
P[i][0] = 0;
}
// 求解表格
for (int i = 1; i <= n; i++)
{
for (int c = 1; c <= C; c++)
{
if (v[i] <= c &&
p[i] + P[i-1][c-v[i]] > P[i-1][c])
{
P[i][c] = p[i] + P[i-1][c-v[i]];
Rec[i][c] = 1;
}
else
{
P[i][c] = P[i-1][c];
Rec[i][c] = 0;
}
}
}
//输出最优解方案
int K = C;
for (int i = 1; i <=n; i++)
{
if (Rec[i][K] == 1)
{
cout << "选择商品" << i << endl;
K = K - v[i];
}
else
{
cout << "不选商品" << i << endl;
}
}
cout << "最大价值为" << P[n][C] << endl;
}
int main()
{
int p[n+1] = {0, 50, 200, 180, 225, 200}; // 各商品价值
int v[n+1] = {0, 5, 25, 30, 45, 50}; // 各商品体积
cout << "************0-1背包问题************" << endl;
knapsack(p, v);
}
软考加油!