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