【leetcode】动态规划之01背包问题

版权声明:转载注明出处 https://blog.csdn.net/deephacking/article/details/82847841

先学会手动填动态规划的表

 后面的颜色块值是根据前面的颜色块值计算出来的,不懂就留言

#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;
}

猜你喜欢

转载自blog.csdn.net/deephacking/article/details/82847841
今日推荐