思路:求出[i,背包容量]所有可能出现的情况的最优方案。i表示前i个物品的数量。
举例:背包容量为15,物品数量为N=5,每个物品的重量为w[N + 1] = {0,5,4,7,2,6},每个物品的价值为v[N + 1] = {0,12,3,10,3,6 }。
[i,背包容量]所有可能出现的情况如下:
i=0,背包容量0,求其最优解
i=0,背包容量1,求其最优解
i=0,背包容量2,求其最优解
i=0,背包容量3,求其最优解
i=0,背包容量4,求其最优解
i=0,背包容量5,求其最优解
i=0,背包容量6,求其最优解
i=0,背包容量7,求其最优解
i=0,背包容量8,求其最优解
i=0,背包容量9,求其最优解
i=0,背包容量10,求其最优解
i=0,背包容量11,求其最优解
i=0,背包容量12,求其最优解
i=0,背包容量13,求其最优解
i=0,背包容量14,求其最优解
i=0,背包容量15,求其最优解
i=1,背包容量0,求其最优解
i=1,背包容量1,求其最优解
i=1,背包容量2,求其最优解
i=1,背包容量3,求其最优解
i=1,背包容量4,求其最优解
i=1,背包容量5,求其最优解
i=1,背包容量6,求其最优解
i=1,背包容量7,求其最优解
i=1,背包容量8,求其最优解
i=1,背包容量9,求其最优解
i=1,背包容量10,求其最优解
i=1,背包容量11,求其最优解
i=1,背包容量12,求其最优解
i=1,背包容量13,求其最优解
i=1,背包容量14,求其最优解
i=1,背包容量15,求其最优解
i=2,背包容量0,求其最优解
i=2,背包容量1,求其最优解
i=2,背包容量2,求其最优解
i=2,背包容量3,求其最优解
i=2,背包容量4,求其最优解
i=2,背包容量5,求其最优解
i=2,背包容量6,求其最优解
i=2,背包容量7,求其最优解
i=2,背包容量8,求其最优解
i=2,背包容量9,求其最优解
i=2,背包容量10,求其最优解
i=2,背包容量11,求其最优解
i=2,背包容量12,求其最优解
i=2,背包容量13,求其最优解
i=2,背包容量14,求其最优解
i=2,背包容量15,求其最优解
i=3,背包容量0,求其最优解
i=3,背包容量1,求其最优解
i=3,背包容量2,求其最优解
i=3,背包容量3,求其最优解
i=3,背包容量4,求其最优解
i=3,背包容量5,求其最优解
i=3,背包容量6,求其最优解
i=3,背包容量7,求其最优解
i=3,背包容量8,求其最优解
i=3,背包容量9,求其最优解
i=3,背包容量10,求其最优解
i=3,背包容量11,求其最优解
i=3,背包容量12,求其最优解
i=3,背包容量13,求其最优解
i=3,背包容量14,求其最优解
i=3,背包容量15,求其最优解
i=4,背包容量0,求其最优解
i=4,背包容量1,求其最优解
i=4,背包容量2,求其最优解
i=4,背包容量3,求其最优解
i=4,背包容量4,求其最优解
i=4,背包容量5,求其最优解
i=4,背包容量6,求其最优解
i=4,背包容量7,求其最优解
i=4,背包容量8,求其最优解
i=4,背包容量9,求其最优解
i=4,背包容量10,求其最优解
i=4,背包容量11,求其最优解
i=4,背包容量12,求其最优解
i=4,背包容量13,求其最优解
i=4,背包容量14,求其最优解
i=4,背包容量15,求其最优解
i=5,背包容量0,求其最优解
i=5,背包容量1,求其最优解
i=5,背包容量2,求其最优解
i=5,背包容量3,求其最优解
i=5,背包容量4,求其最优解
i=5,背包容量5,求其最优解
i=5,背包容量6,求其最优解
i=5,背包容量7,求其最优解
i=5,背包容量8,求其最优解
i=5,背包容量9,求其最优解
i=5,背包容量10,求其最优解
i=5,背包容量11,求其最优解
i=5,背包容量12,求其最优解
i=5,背包容量13,求其最优解
i=5,背包容量14,求其最优解
i=5,背包容量15,求其最优解
代码实现如下:
#include <iostream>
using namespace std;
int main()
{
#define N 5
#define V 15
int B[N+1][V+1] = { 0 };
int ans[N + 1][V + 1] = { 0 };
int w[N + 1] = {0,5,4,7,2,6};
int v[N + 1] = {0,12,3,10,3,6 };
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= V; j++) {
if (j >= w[i]) {
if (B[i - 1][j] > B[i-1][j - w[i]] + v[i]) {
B[i][j] = B[i - 1][j];
}
else {
B[i][j] = B[i-1][j - w[i]] + v[i];
}
}
else {
B[i][j] = B[i - 1][j];
}
}
}
// 输出B数组
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= V; j++) {
cout << B[i][j] << " ";
}
cout << endl;
}
// 求出解决方案
cout << "ans: ";
int j = 15;
for (int i = N; i > 0; i--) {
if (B[i][j] != B[i-1][j]) {
j -= w[i];
cout << i << " ";
}
}
cout << endl;
return 0;
}
参考:https://blog.csdn.net/tracy_frog/article/details/79601115