【leetcode】01背包类型问题

https://www.cnblogs.com/kkbill/p/12081172.html
图解请参考上述文章


#include "bag01.h"
#include <algorithm>
#include <vector>

using namespace std;



// 重点理解dp[i][w]表示什么含义
int maxValue(int w[], int v[], const int count, const int bagSize)
{
	// dp[i][w] 表示前i件物品放入容量为w的背包中可以获得的最大值
	vector<vector<int>> dp(count+1, vector<int>(bagSize+1, 0));

	for (int i = 1; i <= count; i++)
	{
		for (int k = 1; k <= bagSize; k++)
		{
			// 放i号物品。如果背包容量够,那么当前背包的价值为i物品的价值+(减去i物品控件后剩余背包能放下的最大值)
			int val = (k - w[i - 1] >= 0) ? v[i - 1] + dp[i-1][k - w[i-1]] : 0;
			
			// 不放i物品,取二位数组中上一列的值
			int val2 = dp[i - 1][k];
			dp[i][k] = std::max(val, val2);
		}
	}
	return dp[count][bagSize];
}

/*
dp = {						  // dp[i][w] 表示前i件物品放入容量为w的背包中可以获得的最大值

0  0 0  0  0   0  0  0  0     // 初始化这列全为0,方便下标计算
0  0 30 30 30  30 30 30 30    // 当只放第一种道具时,背包中最大价值的变化
0  0 30 40 40  70 70 70 70    // 放前两种道具,
0  0 30 40 50  70 80 90 90    // 放前三种
0  0 30 40 50  70 80 90 100   // 

}
*/

void testBag01()
{

	int w[] = { 2, 3, 4, 5 }; // weight
	int v[] = { 30, 40, 50, 60 }; // value

	int bagSize = 8;

	int res = maxValue(w, v, sizeof(w) / sizeof(int), bagSize);

	printf("01bag:%d", res);
}
展开阅读全文
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值