关于01背包问题和完全背包问题的笔记

前情提要

在代码随想录学习了动态规划二十来题后,想做一做笔记,记录一下对背包问题的理解和需要记住的地方,以下的所有代码均来自代码随想录的代码,图片来自于B站UP主一只小傲风的背包问题视频,

01背包问题

目前来看,01背包问题用来解决求和问题,从一个集合中选择多个数字,这些数字只能取一次。

01背包问题是可以使用二维数组和一维数组来解决,为什么二维能够压缩成一维呢,因为dp数组的取值取决于历史值,也就是dp[i-1],如图1所示关于01背包问题和完全背包问题的笔记_第1张图片

图1

二维dp数组两层for循环正向遍历,可以任意交换遍历顺序,对问题结果的影响应该还是取决于问题本身(完全背包会详细提及该内容,目前没遇到过需要交换的01背包题目,所以是个人想法,不准确);对于一维dp数组来说两层for循环不能交换顺序,必须先遍历物品再遍历背包且背包要倒序遍历,因为dp求值是需要历史数据,如果正序遍历,会改变历史数据(相当于重复拿某个物品,10背包问题不能重复拿),结果不准确了。

02完全背包问题

目前来看,完全背包问题用来解决求和问题,从一个集合中选择多个数字,这些数字能够取无限次。

01背包问题也是可以使用二维数组和一维数组来解决,但是一般使用一维数组搞定,此类问题的公式和dp递推选择范围如图2所示

图2

注意,完全背包问题使用正序的方向开始填写dp数组,不论是先背包还是先物品,无论是一维还是二维,因为该问题的dp填写需要用到当前行的dp值,这是与01背包问题的最大不同。此外,完全背包的两层for循环(先背包还是先物品)也是可以交换的,有没有对结果产生影响取决于需要解决的问题,如求背包最大值,求是否能装满背包,那么两层for交换对结果没有影响,要是是求装满背包的方式有几种之类的问题,那么就有影响,先遍历背包后遍历物品就是排列数(在意先后顺序),先遍历物品再遍历背包就是组合数(不在意先后顺序)。

二维数组下,完全背包问题的状态转移方程为max{dp[v-w[i]]+c[i],dp[v-1]}。不要和01背包问题的二维数组搞混了,虽然他们都是正序遍历。

你可能感兴趣的:(笔记,算法,动态规划,leetcode)