定义
dp[i][j]是从物品0到i中挑选物品,放进容量为j的背包中的最大价值总和。
初始化
int dp[maxn][maxn];
memset(dp, sizeof(dp), -0x3f3f3f3f);for(int j = bag_size; j >= 0; j--)
dp[0][j] = dp[0][j-weight[0]] + values[0];
先遍历物品法
for(int i = 0; i < weight.size(); i++)for(int j = 1; j <= bag_size; j++){if(j < weight[i])dp[i][j] = dp[i-1][j];else dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + values[i]);}
先遍历物品法
for(int j = 1; j <= bag_size; j++)for(int i = 0; i < weight.size(); i++){if(j < weight[i])dp[i][j] = dp[i-1][j];else dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + values[i]);}
输出
return dp[weight.size()-1][bag_size];