01背包滚动数组

01背包用二维数组解决大家都差不多知道了,那是否可以进行空间地压缩,答案是用一维数组,也就是滚动数组。

dp[j],背包容量为j时的最大价值。

我们先计算有物品1时,背包为0-back时的最大价值,计算完毕后,我们再计算有物品2时,背包最大价值然后和之前计算的相比较,对dp数组进行更新,然后计算有物品3时的最大值,然后比较进行更新,最后获得dp数组的最终值,如图。

递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);

初始化:二维数组有dp[i-1],所以要初始化dp[0],这里不需要,默认初始化为0即可。

遍历顺序:上面我们解释了一番,所以先物品1,然后背包0,1,---back,然后物品2,...,所以先物品然后背包。这里我们会发现一个问题,如果我们从背包0开始地话,假如0,1,2,物品1重1,当dp[2]时我们计算了dp[2-1]+value[1]也就是物品1算了两个,但是每个物品只能算一次,所以我们背包从后往前遍历,看代码。

如上图,dp[j-weight[i]]应该由上一排数据得来,如果正序遍历地话,上一排数据地dp[j]将可能被左边给代替(因为我们这里用的是一维数组),导致重复使用物品。

错误例子:背包正序遍历

II II

v v

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值