先学会手动填动态规划的表
后面的颜色块值是根据前面的颜色块值计算出来的,不懂就留言
#include<iostream>
#include<vector>
using namespace std;
int Knapsack(vector<int> weights, vector<int> values, int capacity)
{
//获取物品的个数
int N = weights.size();
//用C表示背包最大容量
int C = capacity;
//维护一个二维矩阵表
int row = N;
int columns = capacity + 1;
vector<vector<int>>MaxValue(row, vector<int>(columns, 0));
//开始更新这个二维矩阵列表的值
for (int i = 0;i < columns;i++)
{//容量从0一次增加到capacity
for (int j = 0;j < row;j++)
{//从上往下,依次更新当前最优值
if (j == 0)
{//第一行特殊处理,容量能装下,就取当前值。装不下,则取值为0;
if (i >= weights[j])
{//当前容量能装下第一件物品
MaxValue[j][i] = values[j];
}
else
{//当前容量不能装下第一件物品
MaxValue[j][i] = 0;
}
}
else if (i == 0)
{
//因为第一列容量为0,所以也全部置为0
MaxValue[j][i] = 0;
}
else
{//后面的值可以用来比较
if (i < weights[j])
{//如果容量装不下新物品,则当前值直接取上一行当前列的值
MaxValue[j][i] = MaxValue[j-1][i];
}
else
{//比较 (装当前物品+剩余容量最大值) 与 (该位置上一行的值) 取最大值为当前值
MaxValue[j][i] = values[j] + MaxValue[j - 1][i - weights[j]] > MaxValue[j - 1][i] ? values[j] + MaxValue[j - 1][i - weights[j]] : MaxValue[j - 1][i];
分割写法
//int value1 = values[j] + MaxValue[j - 1][i - weights[j]];//(装当前物品+剩余容量最大值)
//int value2 = MaxValue[j - 1][i];//(该位置上一行的值)
//MaxValue[j][i] = value1 > value2 ? value1 : value2;//取最大值为当前值
}
}
}
}
//返回矩阵最后的值
return MaxValue[row - 1][columns - 1];
}
int main()
{
int w[5] = { 4, 5, 6, 2, 2 };
int v[5] = { 6, 4, 5, 3, 6 };
int capacity = 10;
vector<int> weights(w, w + 5);
vector<int> values(v, v + 5 );
cout << Knapsack(weights, values, capacity) << endl;
return 0;
}