二维 dp 数组解决 01 背包问题

题目:
背包的最大重量为 4,有3件物品,物品对应的重量和价值为:
weight = { 1, 3, 4 };
value = { 15, 20, 30 };
将哪些物品装入背包里的物品价值总和最大。

// 完整代码

void test_2_wei_bag_problem1()
{
	vector<int> weight = { 1, 3, 4 };		// 物品重量
	vector<int> value = { 15, 20, 30 };	// 物品价值
	int object = 3;						// 物品数量
	int bagWeight = 4;					// 背包容量

	// 定义 dp 数组
	vector<vector<int>> dp(object, vector<int>(bagWeight + 1, 0));

	// 初始化
	// j = 0 的情况就是 0,相当于在定义时就已经初始化了
    // 易出错点一::终止条件处
	for (int j = bagWeight; j >= weight[0]; j--)
	{
		// 这里初始化有两种写法,都可以的,第二种是为了呼应接下来学习的滚动数组
		//dp[0][j] = value[0];
		 dp[0][j] = value[0] + dp[0][j - weight[0]];
	}

	// 遍历 dp 数组
	for (int i = 1; i < object; i++)	// 遍历物品
	{
		for (int j = 1; j <= bagWeight; j++)	// 遍历背包容量
		{
		   	// 易出错点二::终止条件处
			// // 判断的方法一:这里的判断条件忘记了!!!!!!!!
			if (j < weight[i])
				dp[i][j] = dp[i - 1][j];
			else
				dp[i][j] = max(dp[i - 1][j], value[i] + dp[i - 1][j - weight[i]]);

			// // 判断的方法二:
			//if (j - weight[i] >= 0) 
			//	dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

			cout << dp[i][j] << " ";
		}
		cout << endl;
	}
}

int main()
{
	test_2_wei_bag_problem1();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值