0-1背包问题是一个经典的动态规划问题,问题定义如下:有n个物品,其重量分别为W={w1, w1, w3, ... wn},其价值分别为V={v1, v2, v3, .. vn}。现在要将这N个物品放入允许的最大重量为w的包中,问怎样选择物品能使包中的物品总价值最大。
可以将背包问题划分成若干个子问题,关键在于如何对问题进行划分。现在将问题表述为在重量限制为w的情况下,求对前N个物品进行选择能得到的最大价值,即v[n, w]。对于一个物品i,求v[i, w']时有两种情况可供选择:若选中物品i,则所得的最大价值为v[i-1, w'-wi]+vi;若不选中物品i,则所得的最大价值为v[i-1, w']。选择二者之间的较大值即可求出最优解。因此,子问题可以分解成两个更小的子问题。
解决0-1背包问题的C++代码如下所示, 代码中用到了boost库中的multi_array:
0-1背包问题
1#include <iostream>
2#include <boost/multi_array.hpp>
3
4using namespace std;
5
6// 动态规划解决0-1背包问题
7void Knapsack(int weightArray[], int valueArray[], size_t length, int totalWeight)
8{
9 // 价值表
10 boost::multi_array<int, 2> valueTable(boost::extents[length + 1][totalWeight + 1]);
11 // 选择表
12 boost::multi_array<bool, 2> selectionTable(boost::extents[length + 1][totalWeight + 1]);
13 // 初始化前0个物品的最大价值为0
14 for (size_t itemIdx
1#include <iostream>
2#include <boost/multi_array.hpp>
3
4using namespace std;
5
6// 动态规划解决0-1背包问题
7void Knapsack(int weightArray[], int valueArray[], size_t length, int totalWeight)
8{
9 // 价值表
10 boost::multi_array<int, 2> valueTable(boost::extents[length + 1][totalWeight + 1]);
11 // 选择表
12 boost::multi_array<bool, 2> selectionTable(boost::extents[length + 1][totalWeight + 1]);
13 // 初始化前0个物品的最大价值为0
14 for (size_t itemIdx