01背包问题
有n个重量和价值分别为wi、vi的物品,每件物品都有1个。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
限制条件:
1 <= n <= 100
1 <= wi, vi <= 100
1 <= W <= 10000
具体叙述见前博客01背包。
这里要说的是dp数组是一个二维数组,不需要考虑倒序还是正序放入的问题。
先给出代码:
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= W; j++)
{
if(j < w[i])
{
dp[i+1][j] = dp[i][j];
}
else
{
dp[i+1][j] =max{dp[i][j], dp[i][j-w[i]]+v[i]};
}
}
}
i是考虑第i件物品,j是考虑背包容量,dp的值是考虑对应的价值。