本文已参与「新人创作礼」活动,一起开启掘金创作之路。
二维数组 01背包
for(i=1;i<=物品个数;i++) //行表示物品
{
for(j=1;j<=背包容量;j++) //列表示背包容量
{
if(物品容量<=j) //装的下
{
k = 当前物品价值 + dp[i-1][j-当前物品容量];
dp[i][j] = max(k,dp[i-1][j]);//比较放和不放哪个价值更高
}
else //装不下
{
dp[i][j] = dp[i-1][j]; //装i个物品的价值跟装i-1个物品的价值一样
}
}
}
//答案为dp[物品个数][背包容量]
空间优化 一维数组
注意:内层循环要逆序来更新 否则 dp[j-当前物品价值] 会先更新成装i个物品的 这样就导致后面的出错
for(i=1;i<=物品个数;i++) //行表示物品
{
for(j=背包容量;j>=物品容量;j--) //列表示背包容量(大于等于物品价值防止索引越界)
{
if(当前物品容量<=j) //装的下
{
k = 当前物品价值 + dp[j-当前物品容量];
dp[j] = max(k,dp[j]);
}
else //装不下(价值跟装i-1个物品一样,相当于不更新)
{
}
}
}
//答案为dp[背包容量]